我有一个私有成员变量
的类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;
答案 0 :(得分:1)
您的代码的两个版本都存在问题。
第一个版本,
make_shared<short>(dimX*dimY)
使用值dimX*dimY
创建单个堆分配的short。从您的其余问题中可以明显看出,您的代码后来将此逻辑视为维度dimX*dimY
的数组,这正是导致堆损坏的原因(您只分配了一个{ {1}},但你会像许多人一样对待它。
第二个版本有相反的问题。你正在分配short
短片,但是,就你的dimX*dimY
而言,它并不知道。所以它没有你的堆损坏,但shared_ptr
析构函数调用shared_ptr
,而不是delete
(即使你分配了delete[]
,而不是new[]
)
对于这种情况,它“不清楚为什么你需要一个new
开始。为什么不使用shared_ptr
或std::vector<short>
?