为了账号安全,请及时绑定邮箱和手机立即绑定

在C ++中使用指向动态分配对象的指针向量时,如何避免内存泄漏?

在C ++中使用指向动态分配对象的指针向量时,如何避免内存泄漏?

C++
收到一只叮咚 2019-09-19 09:11:20
我正在使用一个指向对象的向量。这些对象派生自基类,并且正在动态分配和存储。例如,我有类似的东西:vector<Enemy*> Enemies;我将从Enemy类派生,然后为派生类动态分配内存,如下所示:enemies.push_back(new Monster());为了避免内存泄漏和其他问题,我需要注意哪些事项?
查看完整描述

3 回答

?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

我假设如下:

  1. 你有一个像vector <base *>这样的矢量

  2. 在堆上分配对象后,您正在将指针推送到此向量

  3. 你想在这个向量中执行派生*指针的push_back。

以下事情浮现在我的脑海中:

  1. Vector不会释放指针指向的对象的内存。你必须自己删除它。

  2. 没有什么特定于vector,但基类析构函数应该是虚拟的。

  3. vector <base *>和vector <derived *>是两种完全不同的类型。


查看完整回答
反对 回复 2019-09-19
?
ITMISS

TA贡献1871条经验 获得超8个赞

使用的麻烦vector<T*>在于,每当向量意外地超出范围时(比如抛出异常),向量会自行清理,但这只会释放它为保存指针而管理的内存,而不是你分配的内存指针指的是什么。因此,GMan的delete_pointed_to功能价值有限,因为它只在没有出错的情况下才有效。

你需要做的是使用智能指针:

vector< std::tr1::shared_ptr<Enemy> > Enemies;

(如果您的std lib没有TR1,请boost::shared_ptr改为使用。)除了非常罕见的极端情况(循环引用)之外,这简单地消除了对象生存期的麻烦。

编辑:请注意,GMan在他的详细答案中也提到了这一点。


查看完整回答
反对 回复 2019-09-19
  • 3 回答
  • 0 关注
  • 617 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信