gpt4 book ai didi

c++ - 从堆空间中删除对象

转载 作者:太空宇宙 更新时间:2023-11-04 11:54:45 25 4
gpt4 key购买 nike

在 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;

}

我的理解:

  1. 即使我不删除这里的对象,也不会产生任何问题,因为一旦进程退出,堆空间就会被清理。因为我的程序范围如上所述受到限制,没有其他人会重用它.那么不使用delete是好是坏呢?您对此有何建议?
  2. 它应该调用对象的默认析构函数,然后调用隐式 multimap 析构函数。所以不需要显式清除 multimap 。如果我错了,请纠正我。
  3. 在父类中只是声明了析构函数,并没有任何定义。那么它会调用隐式析构函数还是忽略调用它?(没有定义它的原因,只是为了更好地理解。)<
  4. 如果调用父类的隐式析构函数,是否应该调用这里定义的子类析构函数?
  5. 由于父类对象是用new实例化的,所以会在堆中创建,然后这个父类对象的成员变量具体存放在哪里。比如对象“a”是一个成员变量,通过查看声明这个成员对象,似乎是在堆栈中创建的。我只是在这里混淆了父对象及其成员子对象的确切内存创建是如何发生的。你能帮我理解这个吗?

最佳答案

  1. 可以,只要您的对象是在 main 中创建的。然而,如果你想改变它,例如创建 B 的多个实例,或者在另一个类中使用它等等,那就是另一回事了。此外,像 valgrind 这样的内存检查工具会给你一个新的 w/o delete 的误报,你很想忽略它。但是,如果它成为一种习惯,您可能会忽略真正的内存泄漏。

  2. 正确,现在如果它是 map<string, string*>那么你可能需要清理

  3. 它将调用默认析构函数

  4. 会的

  5. 我想,您是在问基类成员变量存储在哪里?它们也存储在堆上。它们位于内存中的派生类字段之前。

关于c++ - 从堆空间中删除对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16611304/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com