본문 바로가기

코드^학습/메모한 지식

[C++][MFC] 구조체 선언시 주의할 점

최근에 코드리뷰를 진행하면서 알게된 점을 하나 공유합니다.


C++을 작업하시는 모든 분들은 상당히 구조체를 많이 사용할 것입니다.

자료의 정형화라던지... 인자를 넘기기 위한 방법이라던지...


아무튼 구조체를 정의할 때 혹시 이렇게 정의하시는 분이 계실지도 모르겠습니다.



struct structINI

{

CString strSection;

CString strKey;

CString strData

};


여기에서 뭔가 이상함을 느끼시는 분들이 계실지 모르겠습니다.


저는 이렇게 아주 잘 써오고 있었는데...

여기에는 치명적일수도 있는 결점이 있습니다.


바로 struct 내부에 사용한 자료형이 CString이란 것이 문제입니다.

왜...? CString은 MFC에서 대표적으로 사용할 수 있는 유용한 string관련 자료형인데...?


제가 만든 프로젝트에서도 문제없이 잘 돌아갑니다만

어떤 동작을 취하게 되면, 반드시 문제가 일어납니다.


어떤 동작이냐면... struct를 memset하는 동작이죠.


CString은 자료형 자체에 크기가 고정적이지 않은 자료구조입니다.

string의 크기에 따라 자유롭게 크기가 결정되죠.


만약 이러한 자료구조를 사용하다가 외부(나 이외의 프로그램)에게 전달해준다거나...하는 경우에

memset으로 한번 struct를 싹 초기화해버리면

CString이 가지고있던 주소를 잃어버리고 가진 내용이 모두 날아갈 수 있습니다.


그러면 한쪽에선 자료를 제대로 받아들이지 못하고

왜 자료가 날라갔는지 추측하기가 어렵겠죠.


고런 이유로 구조체 내부에는 '가급적 최대치의 고정형 버퍼를 확보하는 것'이 바람직하다 할 수 있습니다.


C++, MFC를 다루시는 분들은 참고하시면 좋을듯 합니다.