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>>?

Смежные вопросы