Lyn's Article
글 수 22
아래코드는 C++ Builder 2009에서 테스트되었습니다.
//---------------------------------------------------------------------------
#include <vcl.h>
#include <vector>
#include <memory>
#include <iostream>
#include <cstdlib>
#pragma hdrstop
#include <tchar.h>
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개 생성" <<endl;
Test t1; // 생성 되고, 함수가 끝날때 파괴 될 것
cout << "힙에 1개 생성" <<endl;
Test* t2 = new Test; //생성
cout << "힙에서 1개 파괴" <<endl;
delete t2; //파괴
cout << "스택에 10개 생성" <<endl;
Test t3[10];
vector<Test> v1;
cout << "복사생성자가 작동한다" <<endl;
for(int i=0;i<10;++i)
{
v1.push_back(t3[i]);
//이렇게 하면 Copy Contructor 가 작동하므로 오버헤드가 큼
//게다가 반드시 동적으로 할당해야 하는 VCL 객체에는 사용이 불가능
}
cout << "힙에 10개 생성 후 Vector에 넣는다" << endl;
vector<Test*> 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<shared_ptr<Test> > v3;
for(int i=0;i<10;++i)
{
shared_ptr<Test> spt(new Test);
v3.push_back(spt);
//vector 인 v3 역시 Main이 끝나야 파괴됨.
//v3이 파괴되기 전 shared_ptr 의 효과에 의해 v3 이 가지고있던 Test가 모두 파괴
}
cout << "벡터 자체를 동적으로 생성해서 테스트 해 보자" << endl;
vector<shared_ptr<Test> > *v4 = new vector<shared_ptr<Test> >;
for(int i=0;i<10;++i)
{
shared_ptr<Test> 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 가 공간이 부족해서 재할당을 하면서 다시 복사생성자가 호출되기 때문입니다. 생각보다 오버헤드가 많이큽니다.
*/
//---------------------------------------------------------------------------
#include <vcl.h>
#include <vector>
#include <memory>
#include <iostream>
#include <cstdlib>
#pragma hdrstop
#include <tchar.h>
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개 생성" <<endl;
Test t1; // 생성 되고, 함수가 끝날때 파괴 될 것
cout << "힙에 1개 생성" <<endl;
Test* t2 = new Test; //생성
cout << "힙에서 1개 파괴" <<endl;
delete t2; //파괴
cout << "스택에 10개 생성" <<endl;
Test t3[10];
vector<Test> v1;
cout << "복사생성자가 작동한다" <<endl;
for(int i=0;i<10;++i)
{
v1.push_back(t3[i]);
//이렇게 하면 Copy Contructor 가 작동하므로 오버헤드가 큼
//게다가 반드시 동적으로 할당해야 하는 VCL 객체에는 사용이 불가능
}
cout << "힙에 10개 생성 후 Vector에 넣는다" << endl;
vector<Test*> 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<shared_ptr<Test> > v3;
for(int i=0;i<10;++i)
{
shared_ptr<Test> spt(new Test);
v3.push_back(spt);
//vector 인 v3 역시 Main이 끝나야 파괴됨.
//v3이 파괴되기 전 shared_ptr 의 효과에 의해 v3 이 가지고있던 Test가 모두 파괴
}
cout << "벡터 자체를 동적으로 생성해서 테스트 해 보자" << endl;
vector<shared_ptr<Test> > *v4 = new vector<shared_ptr<Test> >;
for(int i=0;i<10;++i)
{
shared_ptr<Test> 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 가 공간이 부족해서 재할당을 하면서 다시 복사생성자가 호출되기 때문입니다. 생각보다 오버헤드가 많이큽니다.
*/
