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
[442] 구조체 항상 초기화 하기 귀잖죠?
김태선 [jsdkts] 14184 읽음    2004-09-24 20:38
쉽게 구조체를 초기화 하는 방법.

가령 TSample sample; 이라는 구조체 변수가 있다면,
이것을 선언하면 전역영역이나 VCL 자손이라면 자동 0으로 초기화 되겠지만,
로컬영역이면 스택에 생성되 그 값을 보증할 수 없습니다.
그래서
ZeroMemory(&sample, sizeof(sample));
식으로 선언후에 항상 초기화 코드가 따라 붙습니다.
이거 귀잖습니다.
이 문제는 구조체를 아래와 같이 생성자를 도입해서 해결할 수 있습니다.

예)
typedef struct TSample_tag
{
  int   a;
  int   b;
  double c;
  ;
  ;
  ; 기타 등등

  TSample_tag()
  {
     ZeroMemory(this, sizeof(*this));
  }
} TSample;

이것은 전역, 지역 가리지 않고 확실히 0으로 초기화 될뿐 아니라
TSample *pSample = new TSample[max];
식으로 메모리를 할당 받아도 자동 0으로 다 초기화 되기에
별도의 초기화 선언이 필요없다는 장점이 있습니다.

물론 이 코드의 삽입으로 구조체의 크기나 기타 동작에는 전혀 영향을 주지 않습니다.
기존 쓰시던 대로 쓰시면 됩니다.

다만 하나 주의할 것은
구조체 내에 클래스 변수를 선언할 때입니다.
물론 클래스 변수라도 * 포인트를 선언하면 아무 문제없지만
실 클래스를 선언하는데 그 클래스 안에 가상함수가 있는 경우는
0으로 초기화 하는 동작이 매우 위험한 결과를 초래합니다.
물론 이 경우는 위처럼 안하고 초기화 리스트를 써야 겠지만,
ZeroMemory로 별도 초기화를 해도 마찬가지로 위험합니다.

그러므로, 거의 실무에서는 위에서 소개하는 방법이 문제가 안될 것입니다.
그리고 가상함수를 포함하는 클래스를 구조체 내부에 포인트로서가 아니라
실클래스변수로 선언할 정도면 이러한 문제를 인식하는 플머겠죠. ^^;

다시 말하자면, 가상함수를 포함하는 클래스 변수는 ZeroMemory 식으로 초기화하면
안되고 별도 초기화리스트를 사용해야 한다는 것을 잊지 맙시다.
내부에 있는 가상함수테이블의 포인트가 손상되어 예외를 일으킵니다.

그럼.. 즐프...
김영민 [youngmin]   2004-11-01 10:44 X
후후.. 알고보니 구조체라기 보다는 C++에서 사용되는 Class에 대한 얘기군요.
제목이 구조체라서 한 번 봤더니.. ㅋㅋ
김성협 [sunghyup]   2005-04-27 15:50 X
구조체에서도 통한다는 얘기져 ^^;;
이난호 [noirhero]   2008-02-14 12:17 X
하나하나 대입해주는게 더 빠를까요?
ZeroMemory가 더 빠를까요?

+ -

관련 글 리스트
442 구조체 항상 초기화 하기 귀잖죠? 김태선 14184 2004/09/24
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.