删除一个类对象数组
Deleting an array of Class Objects
我有一些内存泄漏的问题,我似乎找不到一种方法来修补它们。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
数组分配,并且可能也有相同的泄漏与该数组。
你的基类析构函数不是虚的。这意味着您的派生类的析构函数没有被调用=>内存泄漏
相关文章:
- 将对象数组的引用传递给函数
- 如何使用Visual Studio 2017在C++中为参数化对象数组使用唯一指针
- 在c++中尝试对对象数组进行排序时,出现std:bad_alloc错误
- 类对象数组的问题会导致崩溃
- Arduino C++在构造函数中用参数声明对象数组
- 使用对象数组对 SFML 进行动画处理
- C++ 对象数组堆栈溢出
- 如何将对象数组作为参数传递给模板
- 使用向量初始化参数化构造函数的对象数组
- 如何初始化对象数组?
- C++创建对象数组
- 在对象数组中搜索字符串并返回相应值的函数
- 有没有办法使用该类的构造函数初始化另一个类的私有部分内的对象数组?
- 如何在运行时在对象数组中动态追加新对象C++并打印它们
- 为什么我在声明对象数组时不能使用 -> 运算符?
- 编译时生成应在构造函数中创建的非 constexpr 对象数组
- 使用 C++ 创建对象数组
- 对象数组打印空白字符串
- 重载运算符 [] 用于从对象数组中给出特定索引
- 如何在 C++ 中使用提升属性树从 JSON 文件中读取对象数组