没有分配被释放的指针(怀疑由于双重删除)

时间:2014-11-30 23:19:21

标签: c++ qt

每当我尝试删除指针数组plantLayout [] []中的对象时,我得到错误"被释放的指针未被分配"。我调试它并意识到每次我进入~Plant()析构函数它进入malloc文件然后回到~Plant()析构函数,然后回到malloc文件,然后它得到该错误。我假设这是因为双重删除错误,但我似乎无法弄清楚我哪里出错了。

以下是相关代码:

MainWindow.h :(相关代码)

const static int rows = 5;
const static int columns = 10;
Plant *plantLayout[rows][columns-1];
Plant *seedingPlant;

Plant.h

#ifndef PLANT_H
#define PLANT_H
#include <QString>
#include <QGraphicsPixmapItem>
#include <sun.h>

class Plant
{ 
public:
    Plant();
    int x, y;//top left corner of the plant's lawn piece
    int width, height;//of lawn piece
    int plant, cost, life, range, damage, splash, slow, bomb, sun, need, row, column;
    static int statCost;
    double rate, seeding;
    QString name;
    QGraphicsPixmapItem *icon;
    QString file;
    Sun sunObject;
    bool active;

    virtual void beginAttackingSequence();
    virtual void explosion();

};

#endif // PLANT_H

Plant.cpp

Plant::Plant()
{
    this->sun = 0;
    this->active = false;
    this->height = 60;
    this->width = 60;
    this->sunObject.onScreen = false;
}

void Plant::beginAttackingSequence(){

}

void Plant::explosion(){

}

我将播种植物的集合分配给一个新的SunFlower(),它是植物的子类

seedingPlant = new SunFlower();

然后我将plantLayout [] []数组的某个元素赋给seedingPlant。

plantLayout[r][c] = seedingPlant;

在程序的后期我将seedingPlant重新初始化为植物的另一个不同的子类。

if(plantLayout[r][c] != NULL){
    delete plantLayout[r][c];
}

我检查了该元素是否等于null,这让我相信它是一个导致错误的双重删除!

任何帮助将不胜感激!提前谢谢!

1 个答案:

答案 0 :(得分:2)

您没有发布所有代码,但我可以提出一些建议:

  1. 您提到SunFlowerPlant的子类。如果您有多态继承,那么您总是希望拥有一个虚拟析构函数(有关详细信息,请参阅C++ FAQ 20.7)。在您的情况下,将以下内容添加到Plant声明:

    virtual ~Plant();
    

    并在Plant.cpp中添加一个实现:

    Plant::~Plant()
    {
    }
    
  2. 在调用NULL之前,您正在检查delete。你不需要这样做(它被认为是糟糕的风格)。 delete plantLayout[r][c];本身就好了。有关详细信息,请参阅C++ FAQ 16.8

  3. 确保将plantLayout初始化为0.例如,在MainWindow的构造函数中,您可能需要:

    for (int r = 0; r < rows; ++r)
      for (int c = 0; c < columns-1; ++c)
        plantLayout[r][c] = NULL;
    

    我怀疑“释放的指针未被分配”错误是由于您在delete plantLayout[r][c]未初始化时调用plantLayout[r][c](因此它可能包含一些看似随机的值)。