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
[554] 참조자로 new 클래스 메모리 할당을 받으면 안되나?
김태선 [jsdkts] 7328 읽음    2005-12-22 22:37
안될 이유가 그다지 없어 보이죠.

class CA
{
public:
  int a, b, c;
};

CA & ca = *new CA; // CA의 메모리 할당받은 번지가 ca 의 숨겨진 내부 포인트에 대입될 뿐입니다. 절대 CA 의 메모리 내용 통채로 옮겨 가지 않습니다.

ca.a = 1;
ca.b = 2;
ca.c = 3;

delete &ca; // 메모리 해제는 번지가 필요하므로 &를 씀. 소멸자가 불려지는 것도 문제 없습니다.
// 위처럼 지역변수로 객체 참조자를 선언해서 사용해도 자동으로 객체가 소멸하지는 않습니다. 반드시 delete 해줘야 합니다. 소멸하는 것은 참조자가 가진 내부 포인트 값 4바이트 일 뿐입니다. delete 안해주면 메모리 누수가 발생합니다.

사실 참조자로 받았지만 내부적으로 *ca 의 포인트 변수로 다루어집니다.
ca 변수의 실제 사이즈는 4바이트이고 ca는 할당받은 힙 메모리를 가르키고,
그기에는 CA 클래스에 할당된 공간이 있습니다.
하지만 완전히 포인트는 감춰지고 겉 코딩으로는 실제 객체 인스턴트처럼 다루어집니다.
(지역변수로 참조자를 사용하면 스택에 4바이트 공간을 사용하고,
전역으로 참조자를 사용하면 정적데이타 영역에 4바이트 공간을 사용하게 됩니다.)

참조자로 받으면 뭐가 좋을까요?
코딩으로 보기에 객체라서 코딩이 쬐끔 간편해진다는 것입니다.
그리고 포인트가 감춰지기 때문에 포인트의 변화 가능성이 거의 없다는 것입니다.
물론 강제로 또 값을 할당하면 바뀌기는 하지만 아무래도 포인트보다는 안전하죠.
const로 포인트 값이 바뀌지 못하게 묶지 않아도 보다 안전한 처리가 가능한 것이 장점입니다.
다른 좋은 점이나 나쁜 점은 직접 찾아 보시기를...

VCL 스타일 클래스에 대해서는 어떨까요?
역시 잘 됩니다.

TStringList  * List = new TStringList;  // OK
TStringList  & List = * new TStringList;  // OK

// 테스트

TStringList & L = *new TStringList;
L.Add("하하");
L.Add("호호");
Memo1->Lines = &L;
delete &L;  // 메모리 해제는 이런식으로 해줘야 합니다.

다 잘 되는군요.

그런데 참조자는 선언만할 수 없다는 제약이 있습니다.
다 아시는 바와 같이 참조자 변수는 선언과 동시에 초기화 되어야 한다는 것입니다.
그러므로 클래스나 구조체 안에
CA  & ca;
식으로 선언은 안된다는 것이죠.
반드시 선언과 동시에 초기화 해주어야 하므로
함수 인자나 지역 변수나 전역변수로만 사용할 수 있습니다.


헠.. .이것도 날팁인가... -..-;

+ -

관련 글 리스트
554 참조자로 new 클래스 메모리 할당을 받으면 안되나? 김태선 7328 2005/12/22
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.