首页 > 解决方案 > 双重释放或腐败(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 方式。

非常感谢您的帮助

标签: c++arraysoop

解决方案


您的构造函数分配一个大小为 (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 下运行代码,则此错误应立即突出。


推荐阅读