我遇到了一些内存泄漏问题,我似乎找不到修补它们的方法。 Characters是Sprite *类型的类数据成员。 Sprite是一个继承自Image2D类的类。对象是一个Image2D对象数组,它包含所有可能的精灵以供选择。
class Sprite :
public Image2D
{
private:
char * name;
int left, top;
}
Sprite::~Sprite()
{
delete[] name;
}
class Image2D
{
private:
ConsoleColor fg, bg;
char *text;
unsigned short width, height;
}
Image2D::~Image2D()
{
delete[] text;
}
Class Game
{
private:
Sprite* Characters;
}
Image2D * objects = new Image2D[size];
//fill up objects by reading from file.
Characters = new Sprite[2];
int choice1, choice2;
cout << "\n\nWhich sprite would you like to be? (1, 2, or 3) ";
cin >> choice1;
Characters[0] = *(new Sprite(objects[choice1].GetFG(), objects[choice1].GetBG(), objects[choice1].GetText(), "Player", 10, 10));
cout << "\n\nWhich sprite would you like your opponet to be? (1, 2, or 3) ";
cin.clear();
cin.ignore(INT_MAX, '\n');
cin >> choice2;
Characters[1] = *(new Sprite(objects[choice2].GetFG(), objects[choice2].GetBG(), objects[choice2].GetText(), "Computer", 70, 10));
delete[] objects;
这是我的游戏类的析构函数......
~Game() {
delete[] Characters;
}
泄漏来自角色,特别是当我指定角色[0]和角色[1]时,但我不确定如何修补它们。
解: 变化...
Characters[0] = *(new Sprite(objects[choice1].GetFG(), objects[choice1].GetBG(), objects[choice1].GetText(), "Player", 10, 10));
到
Characters[0] = Sprite(objects[choice1].GetFG(), objects[choice1].GetBG(), objects[choice1].GetText(), "Player", 10, 10);
和字符[1]相同。
答案 0 :(得分:1)
嗯,这是一个原因:
Characters = new Sprite[2]
使用默认构造函数分配两个Sprite
实例。
但是,您将在以下位置覆盖这些实例:
Characters[0] = *(new Sprite(objects[choice1].GetFG(), objects[choice1].GetBG(), objects[choice1].GetText(), "Player", 10, 10));
这样做是Sprite
中数据的浅表副本,意味着它的name
字符串指针被重新指定为指向新分配对象中的位置,但是原始永远不会被释放。因此,当您调用delete[]
时,您手动分配的内容确实已释放,但原始默认分配不是。
你应该成功:
Characters = *Sprite[2]
和
Characters[0] = new Sprite(objects[choice1].GetFG(), objects[choice1].GetBG(), objects[choice1].GetText(), "Player", 10, 10);
或者在operator=
中的copy-constructor / Sprite
内部,您需要确保在重新分配name
/ text
指针之前释放任何保留的内存。< / p>
哦,而且看起来你也没有释放你所做的Image2D
数组分配,并且也可能与该数组有相同的泄漏。
答案 1 :(得分:0)
您的基类析构函数不是虚拟的。这意味着您的派生类析构函数未被调用=&gt;记忆泄漏。