gpt4 book ai didi

C++是否有必要在主作用域的末尾删除动态分配的对象?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:56:51 24 4
gpt4 key购买 nike

在 C++ 中使用动态分配的对象时,例如:

TGraph* A = new TGraph(...);

人们应该总是删除这些,否则对象可能仍然在内存中控制权交还给父作用域。虽然我明白为什么这对于程序的子作用域和子例程是正确的,但对于 main 作用域也是如此吗?

我是否必须删除main() 中动态构建的对象?这对我来说似乎有点冗余的原因是当 main 结束时,程序也结束,因此无需担心内存泄漏。

最佳答案

大多数现代操作系统总是回收它们分配给程序(进程)的所有内存。
操作系统并不真正了解您的程序是否泄漏了内存,它只是收回分配的内容。

但手头还有比失忆更大的问题:

请注意,如果需要调用 delete 的对象的析构函数执行一些重要的操作,并且您的程序依赖于它产生的副作用,那么您的程序就会成为 的牺牲品未定义的行为[引用 1]。一旦发生这种情况,所有赌注都会取消,您的程序可能会显示任何行为。

此外,操作系统通常会回收分配的内存而不是其他资源,因此您可能会间接泄漏这些资源。这可能包括处理文件描述符或程序本身状态等的操作。

因此,在退出程序之前始终通过调用 deletedelete [] 来释放所有分配是一个很好的做法。


[引用 1]C++03 标准 3.8 第 4 段:

"....if there is no explicit call to the destructor or if a delete-expression (5.3.5) is not used to release the storage, the destructor shall not be implicitly called and any program that depends on the side effects produced by the destructor has undefined behavior."

关于C++是否有必要在主作用域的末尾删除动态分配的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10277817/

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