new를 사용하여 배열로 동적 할당을 한 경우 삭제할 때는 delete[]를 사용합니다.

이때 배열의 크기는 어디에 저장되어 있기래 delete[]로 할당한 크기를 정확하게 삭제할까?
라는 의문을 가지는 분들도 있을 것입니다.

테스트를 해 본 결과 GCC 4.6과 VC++10의 경우는 배열로 할당한 곳의 가장 선두 위치에 배열의
크기를 기록해 두는 것 같습니다.

단 이것은 할당하는 객체가 소멸자가 있는 경우이고 소멸자를 호출할 필요가 없는 것은
크기를 기록하지 않는 것 같습니다.

아래는 테스트 코드 입니다.
#include <iostream>

struct X {
    X()
    {
        std::cout << "X의 생성자" << std::endl;
    }

    ~X()
    {
        std::cout << "X의 소멸자" << std::endl;
    }
};

struct Y
{
};

int main()
{
    const std::size_t n = 3;
   
    std::cout << "X 테스트" << std::endl;
    X* pX = new X[n];
    std::cout << *(reinterpret_cast<std::size_t*>(pX) - 1) << std::endl;
    delete[] pX;

    std::cout << std::endl << std::endl;

    std::cout << "Y 테스트" << std::endl;
    Y* pY = new Y[n];
    std::cout << *(reinterpret_cast<std::size_t*>(pY) - 1) << std::endl;
    delete[] pY;
}


결과






참고 : http://d.hatena.ne.jp/faith_and_brave/20120224/1330058808


저작자 표시
신고
by 흥배 2012.03.05 09:00
| 1 |