【发布时间】:2013-05-12 18:07:38
【问题描述】:
在 main 函数中,我使用 new 创建一个对象并且不删除它。我希望进程退出后会清除堆空间。下面是示例代码,其中 A 类的对象是 B 类的成员变量. B类也有一个multimap作为成员变量。
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;
}
我的理解:
- 即使我不在这里删除对象,它也不会产生任何问题,因为一旦进程退出,堆空间就会被清理。因为我的程序范围如上所述,没有其他人会重用它.那么不使用delete是好是坏?您对此有何建议?
- 它应该调用对象的默认析构函数,然后调用隐式多映射析构函数。所以它不需要明确清除多图。如果我错了,请纠正我。
- 在父类中只是声明了析构函数,并没有任何定义。所以会调用隐式析构函数还是忽略调用它?(没有不定义的原因,只是要求更好的理解。)李>
- 如果在父类的情况下调用隐式析构函数,是否应该调用这里定义的子类析构函数?
- 由于父类对象是使用 new 实例化的,它将在堆中创建。然后将存储此父对象的成员变量的确切位置。例如对象“a”是一个成员变量,并通过查看声明这个成员对象,似乎它会在堆栈中创建。我在这里很困惑父对象及其成员子对象的确切内存创建是如何发生的。你能帮我理解一下吗?
【问题讨论】:
-
已编辑:将派生/基础更改为父/子
标签: c++ heap-memory