指针内存泄漏的可能性?
Possibility of a pointer memory leak?
>我有一个用 c++ 编写的基本游戏类,以及一个 Character 类,它将指向游戏的指针作为其构造函数的参数。 我对所有这些新奇的"C++"和"指针"爵士乐相当陌生,所以如果这看起来像是一个菜鸟问题,请耐心等待。 实际的代码包含更多内容,但出于演示目的,我将其压缩了一点:
class Game {
Game() { /* blah blah blah */ };
~Game() {};
};
class Character {
Character(Game *game, unsigned int x, unsigned int y) {
/* here there be dragons */
};
~Character() {} // empty destructor
};
我的问题是,在完成任何给定角色后,我是否需要删除指向主游戏实例的指针,或者指针是否完全与内存泄漏无关?在任何给定的时间点,我在一个游戏中都有 800+ 个字符,所以如果指针导致内存泄漏,就会有一点问题。
我的问题是,在完成任何给定角色后,我是否需要删除指向主游戏实例的指针
不一定。
应该销毁指向的Game
实例,所有对象都应该确定,但是Character
实例应该对此负责吗?
你说会有很多角色实例。考虑一下:是否也会有很多游戏实例?每个角色都指向自己的游戏对象吗?
如果每个角色都有自己独立的游戏,那么角色对游戏的破坏负责确实是有意义的。在这种情况下,使用指针可能很有意义,因为使用直接子对象会更简单。
但是,如果许多角色都提到了一个共享游戏(我怀疑是这种情况),那么单个角色就不能拥有该游戏的唯一所有权,因为一旦任何一个角色被摧毁,其他角色仍然会指向该游戏。
以下是共享所有权的两种方法
-
使用生存期比任何角色实例都长的游戏实例。例如,静态对象或
main
函数中的自动对象。这样,没有角色对破坏负责。棘手的部分是确保在游戏开始之前销毁所有角色实例。 -
使用引用计数智能指针,例如
std::shared_ptr
。这样,当最后一个角色出现时,游戏就会被摧毁。
由于您是动态初始化 Game 对象的,因此在您显式执行此操作之前,它不会被销毁。所以是的,在某个时间点,如果您使用了指针和动态分配,则需要销毁 Game 对象。
您可以通过以下方式对此进行测试:
#include <iostream>
class Game {
public:
Game()
{
std::cout << "Game Object Initializedn";
}
~Game()
{
std::cout << "Game object destroyedn";
}
};
class Character {
Game *g;
public:
Character(Game *game, unsigned int x, unsigned int y) {
g = game;
std::cout << "Character Object Initializedn";
}
~Character()
{
std::cout << "Character Object Destroyedn";
}
};
void main()
{
Game *gameObj = new Game();
Character *characterObj = new Character(gameObj, 0, 0);
delete characterObj;
}
输出:
游戏对象已初始化
字符对象已初始化
角色对象已销毁
在这种情况下,gameObj
在销毁characterObj
后仍然可以访问。您可以将此对象传递给新角色。当然,它需要用delete gameObj;
摧毁.
如果您希望在解除分配所有角色时自动销毁 Game 对象:正如其他人所提到的,您可以改用shared_ptr
对象。
#include <iostream>
#include <memory>
class Game {
public:
Game()
{
std::cout << "Game Object Initializedn";
}
~Game()
{
std::cout << "Game object destroyedn";
}
};
class Character {
std::shared_ptr<Game> g;
public:
Character(std::shared_ptr<Game> game, unsigned int x, unsigned int y)
{
g = game;
std::cout << "Character Object Initializedn";
}
~Character()
{
std::cout << "Character Object Destroyedn";
}
};
void main()
{
//to instantiate a shared_ptr, pass pointer to game as argument in constructor
std::shared_ptr<Game> gameObj(new Game());
Character *characterObj_0 = new Character(gameObj, 0, 0);
Character *characterObj_1 = new Character(gameObj, 0, 0);
delete characterObj_0;
delete characterObj_1;
Character *characterObj_2 = new Character(gameObj, 0, 0);
delete characterObj_2;
}
游戏对象已初始化
字符对象已初始化
字符对象已初始化
角色对象已销毁
角色对象已销毁
字符对象已初始化
角色对象已销毁
游戏对象已销毁
- valgrind-hellgrind与泄漏检查的结果不同
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 尽管遵循了规则,内存泄漏在哪里
- 为什么调用堆栈数组会导致内存泄漏
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 使用模板类的自定义列表类型中的内存泄漏
- 为什么以下C++代码中存在内存泄漏?
- Klocwork Inside的资源泄漏
- OpenCV 我应该使用智能指针来防止内存泄漏吗?
- 我是否生成线程并导致内存泄漏?
- 多线程程序中出现意外的内存泄漏
- 为什么此函数会导致内存泄漏?
- 在 C++ 库中使用cythonized python时内存泄漏
- 需要帮助查找内存泄漏
- C++功能泄漏内存,我是C++新手,不确定如何解决
- 瓦尔格林德的内存泄漏使用新的
- 指针内存泄漏的可能性?
- 在一个块中声明的对象的C++持久性,内存泄漏的可能性