删除类对象数组

时间:2014-03-11 14:21:14

标签: c++ memory-leaks

我遇到了一些内存泄漏问题,我似乎找不到修补它们的方法。 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]相同。

2 个答案:

答案 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;记忆泄漏。