删除一个类对象数组

Deleting an array of Class Objects

本文关键字:对象 数组 一个 删除      更新时间:2023-10-16

我有一些内存泄漏的问题,我似乎找不到一种方法来修补它们。Characters是Sprite*类型的类数据成员。Sprite是继承自类Image2D的类。objects是一个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 << "nnWhich 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 << "nnWhich 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);

原因如下:

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);

或者在Sprite的复制构造函数/operator=中,您需要确保在重新分配name/text指针之前释放了所有持有的内存。

哦,它也永远不会看起来像您释放了Image2D数组分配,并且可能也有相同的泄漏与该数组。

你的基类析构函数不是虚的。这意味着您的派生类的析构函数没有被调用=>内存泄漏