使用make_shared时堆损坏

Heap corruption when using make_shared

本文关键字:损坏 shared make 使用      更新时间:2023-10-16

我有一个类的私有成员变量

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;

两个版本的代码都有问题。

第一个版本

make_shared<short>(dimX*dimY)

创建一个堆分配short,值为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>>呢?