C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 강좌/문서
C++Builder Programming Tutorial&Docments
[179] TObjectList 를 STL 과 TR1에서 흉내내어 보자
Lyn [tohnokanna] 16241 읽음    2008-10-22 11:09
예전에 이경문님도 질문을 올리셧죠.. 방콕폐인님이 답을 다셧었구요.
컨테이너가 해제될때 컨테이너가 가지고 있는 객체를 전부 제거하는 방법.

그때는 방콕폐인님이 올린 답이 뭔소린가~ 햇었는데. 이번에 세미나에서 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 가 공간이 부족해서 재할당을 하면서 다시 복사생성자가 호출되기 때문입니다. 생각보다 오버헤드가 많이큽니다.
김호광 [testcode]   2008-10-25 00:46 X
아시다시피 오버헤드가 없는 방법은 아닙니다. 날려 줘야할 객체가 많을 때 사용하는 것이 현명합니다.

하지만, 게으르고 메모리가 남아도는 윈도우 기반에서는 권장할만한 방법입니다.
김호광 [testcode]   2008-10-25 00:47 X
게임에서 몬스터와 각종 오브젝트를 날려줄 때 메모리 관리용으로 많이 사용합니다.
방콕폐인 [jeong325]   2008-10-29 02:03 X
다 아시는 내용이겠지만....
vector를 list처럼 사용하게 되면 그 속도 저하는 정말 입이 턱 하고 벌어질 정도죠...
근데 아래와 같은 코드가 필요하다고 했을때 delete의 압박에서 해방되고자 vector를 사용한다면 제대로된 성능을 보장합니다.
int * pI = new int[1000];
delete [] pI;
이외에도 deque, list, set, map, hashmap과 같은것들이 많이 있으니까 상황에 맞게 사용 해야죠...

+ -

관련 글 리스트
179 TObjectList 를 STL 과 TR1에서 흉내내어 보자 Lyn 16241 2008/10/22
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.