【发布时间】:2012-10-04 05:16:51
【问题描述】:
这是一个初学者的问题,但我学习了 c# 编程,现在我正在转向 c++,现在我正在使用指针,我知道当我完成它们时我必须从内存中释放它们,但是当程序已关闭,它们是从内存中删除还是留在那里?
【问题讨论】:
这是一个初学者的问题,但我学习了 c# 编程,现在我正在转向 c++,现在我正在使用指针,我知道当我完成它们时我必须从内存中释放它们,但是当程序已关闭,它们是从内存中删除还是留在那里?
【问题讨论】:
除非您删除它,否则您分配的内存(例如使用 New 关键字)将保留在那里!如果您在谈论指针本身,那么是的!在您的程序结束时,指针将被清除!
【讨论】:
freeall 或类似的东西。当程序结束时,它的内存全部被操作系统回收。
请注意,需要释放的不是指针,而是指向的对象。
答案取决于指针指向的内存类型:
new 或new [] 或malloc 或calloc 动态分配的对象,则需要通过调用delete 或delete [] 或free 显式释放它们。 请注意,建议谨慎使用动态分配,如果必须,请使用智能指针而不是原始指针。
编辑:
如果您的问题是:
如果您的程序没有释放内存并退出会发生什么?
答案是:
操作系统回收它。操作系统只是收回它分配给一个进程的所有内存,它不知道您的程序是否泄漏了内存。
但是,自己清理自己的烂摊子始终是一种好习惯。
如果你有一个类的析构函数确实有带有副作用的代码,那么不在动态分配的指针上调用 delete 会导致未定义的行为,它会使你的代码完全悬在编译器的摆布之下。
【讨论】:
当您的程序结束时,它使用的所有内存(无论是否动态分配)都会返回给操作系统。不管它是 C 程序、C++ 程序、C# 程序还是您可能正在编写的任何其他类型的程序。
现在,仅仅因为操作系统会回收内存并不意味着您可以对内存管理不屑一顾。当你的程序运行时,你应该尽量释放你已经完成的所有内存。不这样做会导致“内存泄漏”,这些肯定会影响您的程序及其运行的系统,至少在您的程序运行时是这样。
【讨论】:
delete,不仅会导致内存泄漏,还会导致未定义行为,因此根本不建议这样做。