【问题标题】:Is dynamic memory destroyed when static object is destroyed?静态对象被破坏时动态内存是否被破坏?
【发布时间】:2018-02-26 22:13:22
【问题描述】:

看看下面的代码sn-p:

//A.h
class A
{
  void f();
};

//A.cpp
#include "A.h"

void A:f()
{
  map<string, string> *ThisMap = new map<string, string>;

  //more code (a delete will not appear)
}

//main.cpp
#include "A.h"

int main( int argc, char **argv )
{
  A object;

  object.f();

  //more code (a delete will not appear)

  return 0;
}

当 main() 结束执行时,对象将被销毁。分配给 ThisMap 的动态分配内存也会被破坏吗?

【问题讨论】:

  • 是的 object 将被销毁并从内存中删除。 然而您在A::f 中分配的内存将不会被释放(由您的程序),因此您将发生内存泄漏。经验法则:delete 你是什么 newdelete[] 你是什么 new[]
  • 静态对象在哪里?
  • 除此之外,动态分配标准容器通常是非常不寻常的,而且在大多数情况下确实不需要。如果出于某种原因,它 需要的,那么使用例如std::unique_ptr.
  • 好的!谢谢!在这种情况下,我无法修改代码,我正在对其进行测试,而 CppUTest 没有向我报告泄漏。我放了一个类似的 sn-p 并且没有使用 std::unique_ptr。

标签: c++ oop memory-management dynamic-memory-allocation


【解决方案1】:

是否也会破坏分配给 ThisMap 的动态分配内存?

没有

您有内存泄漏,因为 object 被销毁,它的析构函数被调用,但没有为您的地图调用 delete

专业提示:delete 不管你 new'ed,当你完成它时。


PS:我非常怀疑您是否需要动态分配一个标准容器(如std::map),但如果您确实确定需要使用,请考虑使用std::unique_ptr

【讨论】:

    【解决方案2】:

    是否也会破坏分配给 ThisMap 的动态分配内存?

    不,C++11 之前的经验法则是,如果你 new 某事,你必须在以后 delete 它。

    从 C++11 开始,强烈建议您使用智能指针,它以安全的方式为您处理分配/解除分配。 std::unique_ptr 的文档是一个很好的起点。

    【讨论】:

    • 好的!谢谢!在这种情况下,我无法修改代码,我正在对其进行测试,而 CppUTest 没有向我报告泄漏。我放了一个类似的 sn-p 并且没有使用 std::unique_ptr。
    【解决方案3】:

    没有。
    1.如果你想让ThisMap成为A的数据字段,你必须声明并实现你自己的析构函数,所以你的代码应该是这样的:

    class A
    {
      std::map<std::string, std::string> *ThisMap;
      void f();
      ~A();
    };
    
    void A::f()
    {
      ThisMap = new map<std::string, std::string>;
    
      //more code (a delete will not appear)
    }
    A::~A()
    {
      if(ThisMap) delete ThisMap;
    }
    

    2。如果ThisMap只是一个函数变量,那么你只需要在使用结束时将其删除即可,如:

    void A::f()
    {
      map<string, string> *ThisMap = new map<std::string, std::string>;
      //more code (a delete will not appear)
      delete ThisMap;
    }
    

    请注意,它是 A::f 而不是 A:f
    :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-14
      • 1970-01-01
      • 2017-05-20
      • 1970-01-01
      • 2010-12-25
      • 1970-01-01
      • 2015-09-08
      • 2021-03-03
      相关资源
      最近更新 更多