class A
{
public :
};
struct B
{
};
A 와 B는 빈 클래스와 구조체입니다. 그러면, 크기는 얼마일까요?
아마 0가 되어야 할 것 같다고 생각하는 것이 자연스러운데,
빌더는 각각 8 이라고 크기를 알려줍니다.
정말일까요?
이것은 빌더가 8이라는 값을 돌려주기는 하지만 그것은 잘못된 값입니다.
VC++의 경우는 각각 4라는 값을 돌려주는데 여기에도 문제가 있습니다.
둘다 해당 클래스/구조체를 실제로 선언(A a; B b;)하고 그 번지를 얻으면 아무런 문제없이 얻어진다는데 있으며,
이 메모리 번지는 실상은 자신이 아닌 다른 인스턴스가 차지하고 있는 메모리라는데 심각한 문제가 있습니다.
class C
{
public:
int temp;
};
이 C 클래스 크기는 얼마일까요?
예상과 마찬가지로 4바이트입니다.
빈 클래스/구조체가 아닌 경우는 생각하는 그대로의 사이즈를 가집니다.
가끔 프로그램하다 보면 구조체에 변수를 넣으려고 구조체를 선언하고
그 밑에 이 구조체를 초기화 하는 ZeroMemory(&d, sizeof(d)); 같은 것을
넣어둘 때가 문제가 됩니다.
struct D
{
} d;
나중에 구체적인 변수를 넣어야지 생각했지만 이렇게 코딩했다면
치명적인 에러를 유발시킬 수 있습니다.
포인트를 많이 사용하는 OOP 프로그램에서는 그냥 뻗어버릴 가능성도 높습니다.
정리해서 한마디로 말한다면
빈구조체나 클래스를 ZeroMemory로 초기화하거나 값을 대입해서는 안된다 입니다.
빈구초제나 클래스의 경우는 컴파일러가 메모리 크기를 얼마로 할당한다는 보장이 없기 때문입니다.
그러므로 다른 메모리 영역을 가르키게 되고 그곳을 잘못된 사이즈로 초기화 할 우려가 있기 때문입니다.
작업하다가 구조체가 비게 될때는 임시 변수 int temp; 라도 넣어 두는게 좋습니다.
아니면 구조체를 전부 주석 처리하는 것이 좋습니다.
간단한 사항이지만, 모르면 에러가 왜나는지 삼박사일을 헤메는 수도 있으므로 참고 하세요.
|