使用make_shared时堆损坏
Heap corruption when using 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;
两个版本的代码都有问题。
第一个版本
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中的通用链表中存储的数据已损坏
- gdb错误:Backtrace已停止:上一帧与此帧相同(堆栈已损坏?)
- C++双重释放或损坏(out)
- 捕获标准输出以压缩并使用 CTRL-C 中断会给出损坏的 zip 文件
- 使用全局声明的向量时,C++双重释放错误/损坏
- 变量周围的堆栈'...'已损坏
- 运行时检查失败 #2 变量"A"周围的堆栈已损坏
- 检测到堆损坏:在正常块 c++ 动态 2D 数组之后
- 删除字符串后C++检测到堆损坏
- 两个垫子的 OpenCV 数据是相同的,但使用 Mat::at 检索时的值已损坏
- 引用 std::shared:ptr 以避免引用计数
- 我可以写入关闭的套接字并强制纠正损坏的管道错误吗?
- 损坏的结构字符数组 - sqlite C++
- 运行时检查失败 #2 - 变量"e"周围的堆栈已损坏。发生
- zlib 膨胀在使用小缓冲区时会损坏
- 正在调试 malloc():新内存损坏