gpt4 book ai didi

c++ - 使用 make_shared 时堆损坏

转载 作者:行者123 更新时间:2023-11-30 05:22:27 24 4
gpt4 key购买 nike

我有一个带有私有(private)成员变量的类

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

关于c++ - 使用 make_shared 时堆损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39676527/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com