2012-10-13 29 views
4

这是一个初学者的问题,但我学习了使用c#编程,现在我正在使用C++,现在我正在使用指针,我知道当我完成它们之后,我必须从内存中释放它们,但是当程序是关闭的,他们是从内存中删除还是留在那里?是当C++程序结束时从内存中释放的指针?

回答

13

当程序结束时,它所使用的所有内存(不管是否动态分配)都会返回到操作系统。不管它是C程序,C++程序,C#程序还是其他类型的程序都可以。

现在,仅仅因为操作系统将回收内存并不意味着你可以成为内存管理的骑士。在你的程序运行时,你应该尽量保证释放你完成的任何内存。不这样做会导致“内存泄漏”,这些可能会影响程序及其运行的系统,至少在程序运行时会发生。

+1

+1。这正是发生的事情! –

+1

我想知道是否有古怪的操作系统... –

+0

@MatthieuM。如何Palm OS? :D –

-1

您分配的内存(例如使用New关键字)将保留在那里,除非您将其删除!如果你正在谈论指针本身,那么是的!在程序结束时,指针只会被擦掉!

+0

谢谢!这意味着即使在程序关闭后,写入错误的代码也会导致计算机变慢。有没有freeall();方法还是类似于可以放在程序结尾处的方法? – AntoineLev

+2

@Mostaguen,no。这个答案是错误的。你不需要像'freeall'或者anthing那样。当程序结束时,它的内存全部被操作系统回收。 –

+3

@Mostaguen,在某些情况下最好忘记在最后释放大量这样的内存,因为它会在用户关闭应用程序后让应用程序挂在那里。为了避免内存泄漏,释放分配的内存是非常重要的,但是如果它只分配一次并且相当大,我宁愿应用程序关闭,操作系统照顾它,而不是坐在那里等待,而应用程序“什么也不做” 10秒“。 – chris

2

请注意,它不是需要释放的指针,而是指向的对象。

答案取决于的存储器类型的指针指向:

  • 如果指针指向自动对象,则对象被隐式地清洁。
  • 如果指针指向分配的对象动态使用newnew []malloccalloc,那么他们就需要通过调用RESP或deletedelete []free显式释放。

请注意,建议谨慎使用动态分配,如果您必须,请使用智能指针而不是原始指针。

编辑:
如果你的问题是:如果你的程序不释放内存和出口
会发生什么?

答案是:
操作系统回收它。操作系统只是收回它分配给一个进程的所有内存,它不知道你的程序是否泄漏了内存。
但自己清理垃圾总是一个好习惯。
如果你有一个类的析构函数确实带有副作用代码,那么就不会在动态分配的指针上调用delete导致未定义的行为,并且它会使你的代码完全摆脱编译器的怜悯。

+0

除非他为指针分配内存。但他似乎一下子要问三四个问题。这个问题不明确。 – ShiggityShiggityShwa

+0

我不认为这个问题是模棱两可的。它说:“当程序关闭时,它们会从内存中移除或停留在那里”,并且答案是当进程终止时,操作系统回收所有内存使用该进程。 –

+0

你可以将他写的大部分内容短路,并留下他的答案,但在句子的前半部分和下半部分之间还有其他一些尚未解决的问题。这导致我相信他有其他问题,他没有直接问。他特别提出了关于指针的问题,这让我觉得这个问题很尴尬。 – ShiggityShiggityShwa