예전에 이경문님도 질문을 올리셧죠.. 방콕폐인님이 답을 다셧었구요.
컨테이너가 해제될때 컨테이너가 가지고 있는 객체를 전부 제거하는 방법.
그때는 방콕폐인님이 올린 답이 뭔소린가~ 햇었는데. 이번에 세미나에서 shared_ptr 에 대해 이해를 하고 나서 정리를 한번 해 봅니다. 질답게시판에 두기에는 너무 감동적인(!?) 답변이었거든요
아래코드는 C++ Builder 2009에서 테스트되었습니다.
//---------------------------------------------------------------------------
#include
#include
#include
#include
#include
#pragma hdrstop
#include
using namespace std;
using namespace std::tr1;
class Test
{
public:
int i;
Test()
{
cout << "Test is Create!" << endl;
}
Test(const Test& )
{
cout << "Test's Copy Constructor!" << endl;
}
~Test()
{
cout << "Test is Destroy!" << endl;
}
};
using namespace std;
//---------------------------------------------------------------------------
#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{
cout << "스택에 1개 생성" < v1;
cout << "복사생성자가 작동한다" < v2;
for(int i=0;i<10;++i)
{
Test* tt = new Test;
v2.push_back(tt);
//이렇게 하면 동적으로 할당할 수 있음.
//그러나 vector 를 파괴하기 전에 일일히 루프를 돌면서 delete 해줘야함
//vetror가 파괴될때 내장하고 있는 모든 객체를 파괴할 수는 없을까?
//VCL 에서는 TObjectList 클래스를 제공한다! 그러나 이는 C++ 표준이 아니다.
//게다가 Templete Class 가 아니라 Casting 을 추가로 해줘야 한다는 부담도있다
}
cout << "Vector 에 있는 10개를 파괴" << endl;
for(int i = 10 - 1;i >= 0;--i)
{
delete v2[i];
}
cout << "shared_ptr 을 이용하여 넣는다" << endl;
vector > v3;
for(int i=0;i<10;++i)
{
shared_ptr spt(new Test);
v3.push_back(spt);
//vector 인 v3 역시 Main이 끝나야 파괴됨.
//v3이 파괴되기 전 shared_ptr 의 효과에 의해 v3 이 가지고있던 Test가 모두 파괴
}
cout << "벡터 자체를 동적으로 생성해서 테스트 해 보자" << endl;
vector > *v4 = new vector >;
for(int i=0;i<10;++i)
{
shared_ptr spt(new Test);
v4->push_back(spt);
}
cout << "벡터를 박살내면 가지고 있던 Test 10개도 다 박살난다" << endl;
delete v4;
system("pause"); //이게 끝나야 Main 이 끝나므로 t1은 이 뒤에 파괴
//vector 인 v3 역시 Main이 끝나야 파괴됨.
//v3이 파괴되기 전 shared_ptr 의 효과에 의해 v3 이 가지고있던 Test가 모두 파괴
}
//---------------------------------------------------------------------------
Ps. CopyConstructor 가 10번이 아닌 그 이상 실행 되는데.. 그 이유는 Vector 가 공간이 부족해서 재할당을 하면서 다시 복사생성자가 호출되기 때문입니다. 생각보다 오버헤드가 많이큽니다.
|
하지만, 게으르고 메모리가 남아도는 윈도우 기반에서는 권장할만한 방법입니다.