在main函数中,我使用new创建一个对象,不要删除它。我希望一旦进程退出就会清空堆空间。下面是一个示例代码,其中类A的对象是B类的成员变量B类还有一个多图作为成员变量。
Class A
{
Public:
A(); //have definition in cpp file
~A();//have definition in cpp file
Private:
Int a;
};
Class B{
Private:
Std::multimap<string,string> map_test;
Public:
A a;
B(); //have definition inn cpp file
~B();//does not have any definition in cpp file
};
int main()
{
B *b = new B();
/* code section where it fills some 1000 key value pairs in the multimap
for some purpose */
return 0;
}
我的理解:
答案 0 :(得分:1)
是的,只要您的对象是在main中创建的。 但是,如果您想要改变它并且例如创建B的多个实例,或者在另一个类等中使用它等,那就是另一个故事。此外,像valgrind这样的内存检查工具会给你一个新的w / o删除的误报,你很想忽略它。但是,如果它成为习惯,你可能会忽略真正的内存泄漏。
正确,现在如果它是map<string, string*>
那么你可能需要清理
它将调用默认析构函数
是的,
我想,你在问基类成员变量存储在哪里?它们也存储在堆上。它们位于内存中的派生类字段之前。
答案 1 :(得分:0)
你问了很多问题。
首先是它的最佳实践,即使进程退出并清除所有内存(如此),也可以清除内存。总是处理它......很容易使用shared_ptr ......
析构函数总是以正确的顺序调用,但是你的multimap是一个dangeorus,因为你应该清除multimap中的元素,就像你存储指针一样,它会导致严重的泄漏
答案 2 :(得分:0)
b
的任何原因,您只需在堆栈上创建对象,您就不必考虑资源管理。答案 3 :(得分:0)
事实:在C ++中没有本地(在表下)垃圾收集,尽管有很多东西可以强制执行某种垃圾收集。
因此,在您的代码中,您有内存泄漏。在您分配B的范围结束时,您分配的内存_不是 free'd 。
浏览您的问题列表:
不,如果您不删除指针,内存将不会被释放。关于此主题,您可以做一些事情:
std::shared_ptr
和std::unique_ptr
)并确保他们负责的内存是正确免费的。这取决于。如果您使用new
运算符分配对象,然后将它们插入到地图中,但它们不会在其他任何地方引用,那么您应该手动删除地图的每个条目。它不适用于这种情况,因为地图类型不是指针。
该类甚至可以省略析构函数声明。如果省略它们,编译器将生成析构函数(但也包括复制赋值运算符,复制构造函数和默认构造函数)。
已编辑:这取决于,如果您声明了成员A a;
,则不必显式删除它,当声明为成员的类调用析构函数时,将调用其析构函数。但如果它是你分配的指针(例如在构造函数中),那么你必须在析构函数中删除它。
对对象使用动态内存分配后,整个对象就在堆上,无论其成员如何声明。