2016-09-24 1 views
1

Verwendung habe ich eine Klasse mit privaten VariableHeap Korruption wenn make_shared

shared_ptr<short> m_p_data; 

ich Heapbeschädigung, wenn ich diesen Konstruktor verwenden:

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

aber es gibt keine Heapbeschädigung, wenn ich dies tun statt:

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

Um genauer zu sein, hier ist der Code, den Heap korrumpiert:

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

Antwort

1

Beide Versionen Ihres Codes sind problematisch.

Die erste Version,

make_shared<short>(dimX*dimY) 

schafft ein einzelne Heap zugewiesen kurz mit dem Wert dimX*dimY. Es ist offensichtlich aus dem Rest Ihrer Frage, dass Ihr Code später dies logisch als Array der Dimension dimX*dimY behandelt, die genau das verursacht die Heap-Korruption (Sie haben nur eine einzige short zugewiesen, aber Sie behandeln es wie viele).

Die zweite Version hat das umgekehrte Problem. Sie vergeben dimX*dimY Shorts, aber, soweit Ihre shared_ptr, weiß es nicht. Es hat also nicht Ihre Heap-Beschädigung, aber die shared_ptr Destruktor ruft delete, nicht delete[] (obwohl Sie mit new[] zugewiesen, nicht new).


Für diesen Fall seine unklar, warum benötigen Sie einen shared_ptr zu beginnen. Warum nicht std::vector<short> oder std::vector<std::vector<short>> verwenden?