在主函数中,我使用 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;
}
我的理解:
- 即使我不在这里删除对象,它也不会产生任何问题,因为一旦进程退出,堆空间就会被清理。因为我的程序范围如上所述受到限制,没有其他人会重用它。所以是不使用删除是好是坏?你对此有何建议?
- 它应该调用对象的默认析构函数,然后调用隐式多映射析构函数。所以它不需要明确清除多图。如果我错了,请纠正我。
- 在父类中它只是声明了析构函数,并没有任何定义。那么它会调用隐式析构函数还是忽略调用它?(没有理由不定义它,只是要求更好的理解。)
- 如果它在父类的情况下调用隐式析构函数,是否应该调用此处定义的子类析构函数?
- 由于父类对象是使用new实例化的,它将在堆中创建。然后将存储该父对象的成员变量的确切位置。例如对象“a”是一个成员变量,并通过查看该成员的声明对象,似乎它会在堆栈中创建。我在这里很困惑父对象及其成员子对象的确切内存创建是如何发生的。你能帮我理解这个吗?