알다 시피 C++ 프로그래머에게 있어, 클래스의 멤버가 pointer 일 경우 각별한 주의가 필요로 한다는 것은 알 것이다. 그렇다면, 영리한 포인터 녀석들을 넣을 경우, 생길 수 있는 문제점을 알고 있는가? 이번 항목은 그런 문제에 대해서 이야기 하고 생각해 보는 시간을 갖기 위해 존재 한다. 질문 1. 다음 코드가 매우 불안한 이유는? class X1 { ~X1() { delete p_ } X1( int * p ) p_( p ) { } // 컴파일러가 만들어 주는 복사 생성자와 // 복사 할당자를 이용 한다. private: int *p_; }; 단번에 알겠지만, 메모리 누수가 일어 나거나, 두번 릴리즈 하게 된다. 질문 2. 그렇다면 스마트 포인터를 사용 한다면, 어떤 문제가 있을까? class X..
auto_ptr 검색 결과
std::auto_ptr 에 대한 이야기이다. 이것은 표준에 있는 스마트 포인터 이기 때문에, 스마트 포인터의 대표격이다. 물론 C++ 0x 에선 shared_ptr 이 .. 대표로 갈아치우지 않을까 한다. : ) 질문 1. auto_ptr을 잘못 사용 하고 있는 코드이다. 한번 찾아 보아라. template void f( size_t n ) { auto_ptr p1( new T ); auto_ptr p2( new T[n] ); // .. 할일 있으면 더 한다. } 질문 1은 바로 답을 말하면, 배열을 담았다는 데에 있다. auto_ptr 은 배열을 담는다 해도 delete[] 를 호출해 주지 않기 때문에 문제이다. 질문 2. 이 문제를 어떻게 해결할 것이며, 어댑터 패턴이나 생성 작업의 문제점과 aut..
이번 항목은 표준 auto_ptr을 안전하고 효율적으로 사용하는 방법에 대한 기본적인 것들을 다룬다. C++ 세계에 있어, 이번 항목은 좀 특별하다. 왜냐하면 최종 C++ 98 표준안 : "Final Draft International Standard for Programing Language C++"이 완벽하게 결의되는 마지막 모임이 시작되는 전날에 auto_ptr의 이 문제점이 알려 졌기 때문이다. 그렇다면 이 문제가 무엇인지 알아보자! #include #include #include #include class T { public: bool operator( const T& rhs ) const { return rhs.a > a; } int value( void ) const { return a; }..
부제 : auto_ptr 효과적으로 사용 해라. 이유 1. 생성단계에서 동적메모리 할당시 메모리 릭이 발생할수 있기 때문이다. 구현 방법 1. 역시 메모리 할당을 auto_ptr(이런 성격의 객체)이 받으면 된다. 예) auto_ptr test; 선언 후 초기화 리스트에서 초기화! new를 호출하여 초기화 주의점 1. auto_ptr 사용시 소유권이란 개념이 분명히 존재하므로 잘 이해하고 적재적소에 써야 한다. 개인적인 생각 1. 클래스 내부에서 메모리 누수를 막는 방법이 제일 좋은것 같다. 왜냐하면 객체의 생성 자체가 메모리 할당을 동반하는 작업이 많이 때문이다. 클래스 외부에서 이런 메모리 누수처리를 한다면, 정말 힘든 세상이 될것같다. 집안 싸움은 집안에서 끝내야 한다는 속담이 떠오른다. 참조 사항..
부재 : 함수 내부의 동적 메모리 할당은 auto_ptr(의 성격으로 이해하면 더 좋을듯) 을 사용 해라! 이유 1. 소멸자는 객체 소멸시 반드시 호출 되는 성질을 이용하기 때문이다. (소멸자가 호출 안되는 에외도 있으나, 그건 차후에 설명하겠다고 스캇은 말한다.) 구현 방법 1. 동적메모리 할당시 반환되는 메모리를 인자로 같는 객체의 생성자를 만들고, 소멸자에 이 인자를 지워 준다. 효과 1. 함수 내부에서 예외가 발생하여, 함수 루틴이 종류가 되어도 객체는 소멸되기 때문에 삭제가 된다. 대표적 사례 1. 기본 지원되는 auto_ptr 을 사용하면 손쉽게 구현 가능하다. 2. auto_ptr 에 대해서 인터넷 검사면, 그 개념이 잡힐것이다. 간단한것은 스스로 만들어 써도 되지만 MEC++ 읽는 사람이라..
최근댓글