静态对象被销毁时是否会破坏动态内存?

时间:2017-09-18 11:28:43

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

看一下以下代码片段:

//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()结束执行时,对象将被销毁。会被销毁的dinamic分配的内存也分配给ThisMap吗?

3 个答案:

答案 0 :(得分:2)

  

会破坏dinamic分配的内存,也可以归入ThisMap吗?

的!

你有内存泄漏,因为object被破坏,它的析构函数被调用,但没有为你的地图调用delete

专业提示:delete当您完成任务时new已编辑。

PS:我非常怀疑你需要动态分配标准容器(如std::map),但如果你确定需要使用它,那么请考虑使用std::unique_ptr

答案 1 :(得分:0)

  

会破坏dinamic分配的内存,也可以归入ThisMap吗?

不,C ++ 11之前的经验法则是,如果你<link href="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.100.2/css/materialize.min.css" rel="stylesheet"/> <a href="#" class="btn"> <!-- added the svg to the html --> <i><svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="384" height="448" viewBox="0 0 384 448"> <path fill="#000" d="M246.25 243.5c4.25 0 45 21.25 46.75 24.25 0.5 1.25 0.5 2.75 0.5 3.75 0 6.25-2 13.25-4.25 19-5.75 14-29 23-43.25 23-12 0-36.75-10.5-47.5-15.5-35.75-16.25-58-44-79.5-75.75-9.5-14-18-31.25-17.75-48.5v-2c0.5-16.5 6.5-28.25 18.5-39.5 3.75-3.5 7.75-5.5 13-5.5 3 0 6 0.75 9.25 0.75 6.75 0 8 2 10.5 8.5 1.75 4.25 14.5 38.25 14.5 40.75 0 9.5-17.25 20.25-17.25 26 0 1.25 0.5 2.5 1.25 3.75 5.5 11.75 16 25.25 25.5 34.25 11.5 11 23.75 18.25 37.75 25.25 1.75 1 3.5 1.75 5.5 1.75 7.5 0 20-24.25 26.5-24.25zM195.5 376c86.5 0 157-70.5 157-157s-70.5-157-157-157-157 70.5-157 157c0 33 10.5 65.25 30 92l-19.75 58.25 60.5-19.25c25.5 16.75 55.75 26 86.25 26zM195.5 30.5c104 0 188.5 84.5 188.5 188.5s-84.5 188.5-188.5 188.5c-31.75 0-63.25-8-91.25-23.5l-104.25 33.5 34-101.25c-17.75-29.25-27-63-27-97.25 0-104 84.5-188.5 188.5-188.5z"></path> </svg> </i> <span>Testing</span> </a>某事,你必须稍后new

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

答案 2 :(得分:0)

没有。
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 :)