메모리에 대해서 얼마나 많이 알고 있나? 어떤 다른 메모리 영역이 있나? 이 문제는 C++의 주요한 독립적인 메모리 저장소에 기초를 두며, 좀 더 자세히 이해하여 메모리 관리를 보다 효율적으로 할 수 있는것에 초점을 둔다. 문제 : C++의 주요한 독립적인 메모리 저장소는 무엇이 있나? 해설 메모리 영역 특성들과 개체 활동 주기 상수 데이터(Const Data) 상수 데이터 영역은 문자열과 컴파일 시점에 값을 알 수 있는 다른 데이터들을 저장한다. 클래스 형식의 개체는 이 영역에 존재 할수 없다. 이 영역의 모든 데이터는 프로그램의 전체 활동주기 동안 가능하다. 게다가, 이 모든 데이터는 읽기 전용이므로, 이를 수정하면 정의되지 않은 결과가 나온다. 이곳에 저장을 하는것은 컴파일러에 의해 결정 되므로, ..
책 정리/Exceptional C++ 검색 결과
이 문제는 C++ 이디엄(idiom)으로 자주 추천 받고 있지만, 잘못 사용되면 심각한 문제가 발생할 수 있다는 것을 고려해야 한다. 이디엄을 보도록 하자. T& T::operator=( const T& other ) { if( this != &other ) { this->~T(); new (this) T( other ); } return *this; } 문제 이 코드는 어떤 일을 하기 위해서 작성 되었을까? 이 코드의 잘못된 점을 찾아 고쳐라 잘못된 점을 고치더라도, 이 이디엄이 안전한가? 안전하지 않다면 어떻게 해야만 프로그래머의 의도되로 될 수 있을까? 부연 설명 이 예제는 개체의 생성 법칙에 대하여 증명하기 위한 용도로 사용 될 뿐, 좋은 연습에 관련된 예제라고 추천하지 않습니다. 분석 (1). ..
이번 항목은 개체의 지금 존재 하는가? 존재 하지 않는가? 를 생각하게 한다. 개체가 존재하지 않은데 접근을 하면 에러가 날 수 있듯이, 어떨 때 달라지는지에 대해서 알아보자. template void f( void ) { T t( 1 ); T& rt = t; /* -- #1 : t 또는 rt에 관련된 어떤 것을 수행 -- */ t.~T(); new (&t) T(2); /* -- #2 : t 또는 rt에 관련된 어떤 것을 수행 -- */ } /* 여기서 t가 다시 소멸 된다. */ 이 코드의 #2 부분은 합법 적인가? 분석 이 코드는 합법적(문법이)이며, new (&t) T(2); 예외를 발생되지 않는 다면 매우 안전한 코드이다.^^ 여기서 짚고 넘겨야 하는 것은 t.~T(); 호출 후 ~ new (&t..
이번 항목은 디버깅에 있어 정말 난해한 자동 변환에 대해서 알아본다. 자동 변환은 사용자 입장(함수들..)에선 편하지만, 구현자 입장(프로그래머)에서 보면 정말 염두해야 한다. 그 이유를 알아보자. 표준 C++ string 은 const char*로의 어떠한 암시적 변환을 가지지 않는다. 다음 코드를 보면 정말 필요할 듯 한데 말이다. #include int main( void ) { std::string s1( "hello" ), s2( "world" ); strcmp( s1, s2 ); // 에러 strcmp( s1.c_str(), s2.c_str() ); // 성공 return 0; } 이 코드의 에러 나는 부분에서 알아서 형 const char* 형태로 변환되면 얼마나 좋을까? 어챂 const c..
두 개의 포인터가 같은 객체를 가리키고 있는지 그 판단을 하기 위한 알고리즘을 제시하는 항목이다. 다음의 코드 this != &others 검사는 자기 할당을 피하기 위한 기본 방법이다. 과연 이 조건절만으로 자기 할당을 피하는게 가능할까? 그렇지 않은 경우와 어떻게 고칠 수 있는지 알고리즘을 만들라. T& T::operator=( const T& other ) { if( this != &other ) { /* ... 처리 세부 사항 ....*/ } return this*; } 문제 : 정말로 이것으로 자기 참조를 피할수 있을까? 피할수 없다면 어떻게 고칠 수 있을까? 고칠 수 있다면 그 알고리즘은 어떻게 만들어 졌는가? 나는 이 항목을 시작하기 전에 한가지 생각에 빠지게 되었다. "자기 대입이 왜 나뻐..
갑작 스러운 질문 부터 시작한다. 자원을 단순히 관리하고 마지막 try/catch 구문을 덤으로 제거할 수 있는 좀 더 진보적인 기술들을 어떻게 적용할 수 있을까? 내재된 데이터형 T의 요구사항을 줄여서 Stack을 개선할 수 있는 방법이 있을까? 일반적인 컨테이너에서 예외 설계를 사용할 수 있을까? new[]와 delete[]가 정말로 하는 일은 무엇일까? 지금까지 만들어본 Stack 의 주요 예외안전성을 메모리를 관리하는 방법에 그 초점을 두고 있다. 따라서, 이런것만 따로 관리하는 보조클래스를 한쪽에 두는것이 좋을 듯 싶다. 다음 코드를 이런 초점에 맞추어서 만들어진 클래스이다. template class StackImpl { /* ? ? ? ? ? */ StackImpl( size_t size =..
최근댓글