看一下以下代码片段:
//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吗?
答案 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
:)