2016-09-24 2 views
1

를 사용하여 나는 개인 멤버 변수가있는 클래스가힙 손상 make_shared

shared_ptr<short> m_p_data; 

나는이 생성자를 사용할 때 힙 손상을 얻을 : 나는이 작업을 수행 할 경우

Volume2D(const int dimX, const int dimY) :m_dimX{ dimX }, m_dimY{ dimY }, m_p_data{ make_shared<short>(dimX*dimY) } { 
} 

을하지만 힙 손상이없는 대신 :

Volume2D(const int dimX, const int dimY) :m_dimX(dimX), m_dimY(dimY) { 
    m_p_data.reset(new short[dimX*dimY]); 
} 

더 구체적으로, 여기에 힙 손상 코드입니다 :

Volume2D vol(10, 1); 
for (auto i = 0; i < 10; ++i) { 
    vol(i, 0) = i; 
    cout << "value = " << vol(i, 0) << endl; 
} 
return 0; 

답변

1

두 가지 버전의 코드에는 문제가 있습니다.

최초 버전

,

make_shared<short>(dimX*dimY) 

가 만드는 단일 힙 할당 값 dimX*dimY 짧은. 당신의 질문의 나머지 부분에서, 코드가 dimX*dimY 배열의 배열으로 이것을 논리적으로 취급한다는 것을 알 수 있습니다. 이것은 정확하게 힙 손상을 일으키는 것입니다 (단 하나의 short을 할당했지만,).

두 번째 버전은 반대의 문제가 있습니다. 너는 dimX*dimY 반바지를 할당하고 있지만, shared_ptr까지는 알지 못한다. 따라서 힙 손상은 발생하지 않지만 shared_ptr 소멸자는 delete이 아니라 delete[]이 아니며 new[]이 아니라 new이 아닌데도 할당합니다.


이 경우 'shared_ptr이 필요한 이유는 확실하지 않습니다. std::vector<short> 또는 std::vector<std::vector<short>>을 사용하지 않으시겠습니까?