c++ - 双重释放或腐败(out)以及如何检查析构函数是否正常工作
问题描述
我正在尝试改进要使用类创建的二维数组。所有方法都工作正常,它被正确打印出来等等,但是当我尝试创建一个析构函数时我得到一个错误double free or corruption
,我能够摆脱错误消息但是我不确定内存是否已经被删除- 正确分配,因为我使用了两个new
关键字,但只有一个delete
.
这是我的班级声明:
#pragma once
class myPlan
{
int slots;
int rows = 3;
int **cell;
public:
myPlan(int slots); // Constructor
~myPlan();
};
这是定义
#include "myPlan.hpp"
myPlan::myPlan(int slots)
{
this->slots = slots;
// Create a dynamic array of pointers
cell = new int* [rows];
// Create a row for every pointer
for (int i=0; i<slots; i++)
{
cell[i] = new int[slots];
}
for(int i =0; i<3; i++)
{
for (int j=0; j<slots; j++)
{
cell[i][j] = 0; //setting all cells to zero
}
}
}
//this destructor works
myPlan::~myPlan()
{
std::cout<<"preparing for destruction"<<std::endl;
delete[] cell;
std::cout<<"Destroyed class"<<std::endl;
}
//this returns the double free error
/*
myPlan::~myPlan()
{
for(int i = 0; i < rows; ++i)
{
delete[] cell[i];
}
delete[] cell;
}
*/
我知道这是性能方面较慢的解决方案(堆分配),我尝试使用 std::vector 方式。
非常感谢您的帮助
解决方案
您的构造函数分配一个大小为 (3) 的顶级数组,rows
然后继续填充slots
它的 (10) 个元素:
cell = new int* [rows];
// Create a row for every pointer
for (int i=0; i<slots; i++)
{
cell[i] = new int[slots];
}
由于cell
仅包含 3 个元素,因此通过写入过去分配的内存来彻底破坏堆后的 7 次分配。如果您在valgrind
或 Memory sanitizer 下运行代码,则此错误应立即突出。
推荐阅读
- amazon-web-services - 驱逐 pod kube-system/dns-controller 卡住
- fastlane - 为什么使用fastlane match nuke时还需要输入密码
- typescript - 在 VS Code 中对 AWS SAM 无服务器应用程序进行 TypeScript 调试
- docker - Traefik 将 SSL 转发到 php-nginx docker 映像(到 Laravel 的 https 流量)
- python - 基于多个用户输入值过滤 Pandas 数据帧
- html - div后动态添加div
- sql - 在表中的每条记录中创建数据验证的最简单方法是什么?
- python - 运行 TensorFlow 操作时的内存使用情况
- vba - 抓取元数据属性
- css - 如何在 VS Code 中折叠或折叠多个 CSS 规则?