쉽게 구조체를 초기화 하는 방법.
가령 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 식으로 초기화하면
안되고 별도 초기화리스트를 사용해야 한다는 것을 잊지 맙시다.
내부에 있는 가상함수테이블의 포인트가 손상되어 예외를 일으킵니다.
그럼.. 즐프...
|
제목이 구조체라서 한 번 봤더니.. ㅋㅋ