使用make_shared时堆坏了

时间:2016-09-24 12:49:46

标签: c++

我有一个私有成员变量

的类
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 个答案:

答案 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_ptrstd::vector<short>