【问题标题】:c++ operator new and delete memory leak with containersc++ operator new 和 delete 与容器的内存泄漏
【发布时间】:2012-12-07 04:05:45
【问题描述】:

似乎是一个简单的问题,但我很怀疑。当我为非空列表使用运算符创建 new 调用delete list 时,运算符delete 会破坏所有 Object 的元素吗?当然会,但我需要确认。如您所见,Object 有构造函数,但没有分发器。

代码:

std::list<Object>* ptr_listObjects = new std::list<Object>();
OtherObject* ptr_null = NULL;
ptr_listObjects->push_back ( Object( ptr_null, 'A') );
ptr_listObjects->push_back ( Object( ptr_null, 'A') );
ptr_listObjects->push_back ( Object( ptr_null, 'A') );
ptr_listObjects->push_back ( Object( ptr_null, 'A') );
ptr_listObjects->push_back ( Object( ptr_null, 'A') );
ptr_listObjects->push_back ( Object( ptr_null, 'A') );
delete ptr_listObjects; // no any possible memory leaks? (Object does not use `new` operator)


class Object
{
public:
    Object( OtherObject* ptr_other, char xxx):
    ptr_OtherObject(ptr_other),
    charflag(xxx)
    {}


    OtherObject* ptr_OtherObject;
    char charflag;
};

【问题讨论】:

  • 我很确定它也会。但是处理这种情况最简单的方法是创建一个析构函数来打印一条消息并查看是否有任何输出。
  • 我假设您的意图是在此示例中为 Object 类练习 Rule of Three。有时您不需要(对象不“拥有”ptr_OtherObject 对象),但很难说这是不是其中之一。希望你会知道(毕竟是你的代码)。

标签: c++ list memory containers memory-leaks


【解决方案1】:

std::list 析构函数将运行,其元素的析构函数也将运行。也就是说,你为什么要动态分配一个容器?您使容器无法为您管理内存。让它发挥作用;分配具有自动存储期限的列表。

顺便说一句,Object 确实有一个析构函数,编译器会为你生成一个空的。但是没有什么要清理的,所以它什么也没做。此外,从类设计中可以清楚地看出,Object 的实例不拥有它在其构造函数中接收的指针,因此请确保永远不要释放它,除非您对设计进行了重大更改。

【讨论】:

  • 谢谢。我正在动态分配它,因为我 1)在许多函数中使用它并通过函数传输它的指针 2)然后我将它存储约 30 分钟,只有这样我才能使用操作员 delete.. 销毁它
  • @abrahab:还有其他方法。老实说,我从未动态分配过这样的容器(而且我每天都在编写 C++ 代码,当然,这并不意味着我遇到了所有情况)。您可以通过引用将容器传递给函数。如果这不起作用,那么您应该将其维护为unique_ptr&lt;std::list&lt;Object&gt;&gt;。智能指针将为您释放它。我没有充分的理由去做你正在做的事情。
  • 谢谢,我不太擅长c++,也不会使用unique_ptr,因为我是按照旧的C++标准编写的...不知道如何使用C++的新特性并编译gcc 似乎不知道新标准的旧机器,例如 FreeBSD 6&7...
  • @abrahab:没关系,这需要时间。在日常编写 C++ 时,我真的从不 使用operator newoperator delete,如果我这样做,它是由某种智能指针管理的。您始终可以使用 boost,并且您还可以访问 std::auto_ptr,尽管它已被弃用是有充分理由的。
猜你喜欢
  • 1970-01-01
  • 2015-11-06
  • 1970-01-01
  • 2010-11-19
  • 2012-03-04
  • 2021-05-08
  • 1970-01-01
  • 2011-11-09
  • 1970-01-01
相关资源
最近更新 更多