每当我尝试删除指针数组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,这让我相信它是一个导致错误的双重删除!
任何帮助将不胜感激!提前谢谢!
答案 0 :(得分:2)
您没有发布所有代码,但我可以提出一些建议:
您提到SunFlower
是Plant
的子类。如果您有多态继承,那么您总是希望拥有一个虚拟析构函数(有关详细信息,请参阅C++ FAQ 20.7)。在您的情况下,将以下内容添加到Plant
声明:
virtual ~Plant();
并在Plant.cpp中添加一个实现:
Plant::~Plant()
{
}
在调用NULL
之前,您正在检查delete
。你不需要这样做(它被认为是糟糕的风格)。 delete plantLayout[r][c];
本身就好了。有关详细信息,请参阅C++ FAQ 16.8。
确保将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]
(因此它可能包含一些看似随机的值)。