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

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[968] 스마트포인트인 AutoPtr 클래스.
김태선 [cppbuilder] 8358 읽음    2010-03-15 13:21
외부에 나와서 잠시 코딩할 일이 있는데
포인트 변수 일일이 해제 해주는게 귀잖아
smart_ptr 이나 AutoPtr을 검색했더니 없어서 그냥 올려 둡니다.
최근 언어는 다 객체가 자동 소멸하는 스마트포인트로 가고 있는데,
하여간 포인트 일일이 시점에 맞춰 해제해 주어야 한다는 것은 귀잖기 이를데 없는 것은 대부분 프로그래머가
공통으로 느끼는 점인가 봅니다.

#ifndef __AUTOPTR_KTS_H
#define __AUTOPTR_KTS_H

//---------------------------------------------------------------------------
// 초간단 스마트포인트
//	 	AutoPtr로 선언한 객체의 원래 멤버 참조는 -> 로 한다.
//      단일 객체 생성 및 소멸을 자동 관리하므로, 용도에 맞게 써야 한다.
//
// KTS.

template
class AutoPtr
{
public:
	T  *Ptr;							// 본래형을 확실히 인식시킬 때. instance->ptr 을 바로 쓰면 된다.
public:
	AutoPtr(T * p) : Ptr(p) { }
	~AutoPtr() { delete Ptr; }
	T * operator->() { return Ptr; }	// 본래 객체의 포인트 참조.
	T & operator*()  { return *Ptr; }	// 본래 객체의 내용 참조.
	operator T*()    { return Ptr; }	// 본래 객체형이 요구되는 것은 자동 참조되게.
};

// 이건 배열 객체용.
// 메모리 해제할때 배열 해제가 되도록.

template
class AutoArrayPtr
{
public:
	T  *Ptr;							// 본래형을 확실히 인식시킬 때. instance->ptr 을 바로 쓰면 된다.
public:
	AutoArrayPtr(T * p) : Ptr(p) { }
	~AutoArrayPtr() { delete[] Ptr; }
	T * operator->() { return Ptr; }	// 본래 객체의 포인트 참조.
	T & operator*()  { return *Ptr; }	// 본래 객체의 내용 참조.
	operator T*()    { return Ptr; }	// 본래 객체형이 요구되는 것은 자동 참조되게.
};

// ex:
// AutoArrayPtr buffer(new byte[MaxSize]);	// 선언시는 * 포인터는 빼고 형만 기재한다.
// AutoPtr stm(new TMemoryStream());
//---------------------------------------------------------------------------
#endif



사용법은 위에 ex 식으로 선언하면 됩니다.

{
     AutoPtr<class_or_type_name> var(new class_or_type_name());
    ;
    do_work_with_AutoPtr(var->Method('hallo'));
    ;
} // 스마트포인트 변수가 해당 스코프를 벗어날때, 자동으로 소멸합니다.
   // 즉 자동으로 소멸자를 호출해 줍니다
   // 루틴 중간에 에러나 예외가 나던지 return 등으로 해당 스코프를 빠져 나올때도 소멸자가 자동으로 호출 됩니다.
   // 그래서 일일이 delete 소멸자를 써주는 식보다 훨씬 신뢰도 높은 프로그램을 쉽게 만들 수 있습니다.

선언 방법이 다소 까다로워 보이지만
자세히 살펴 보면 그냥 class 객체 선언하는 것과 다를게 없습니다.
생성자에 원래의 포인트를 요구하기 때문에 반드시 생성자의 인자로 원래 객체를 생성해 주어야 한다는 것만 기억하면 됩니다.

원칙은 new 로 생성하는 객체를 자동으로 해제하는 것이 목적이지만
    int *p = new int;
    AutoPtr<int> pp(p);
식으로 이미 만들어진 객체의 자동 해제 목적으로도 쓸수 있습니다.

원래의 객체 타입을 강제화 시킬때는
    pp.Ptr 로 Ptr 멤버 변수를 바로 참조하도록 하면 됩니다.              



워낙 소스가 간결하고 이해하기 쉬워서 필요하면 기능을 수정해서 사용하기도 좋을 것입니다.

그럼.

그런데 왜 class 글자가 CLASS로 융기 했을까요?

+ -

관련 글 리스트
968 스마트포인트인 AutoPtr 클래스. 김태선 8358 2010/03/15
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.