c ++指针和内存泄漏 - 答案

时间:2017-08-26 15:49:02

标签: c++ pointers memory memory-leaks

我已经用PHP,SQL,Javascript,Java,C#,Delphi编写了代码。我不是专家,但我可以成就伟大的事物。现在,我从一开始就学习C ++,因为我认为作为一种低级语言,理解更接近硬件的东西(如指针)会非常有趣。

我在这里和谷歌上都有很多关于指针的内容。我理解他们并不像许多人所说的那么难理解。我想如果你理解参考文献,你应该理解指针。

然而,目前还不清楚内存是否泄漏。事实上,我认为它只是来自论坛的许多答案,甚至在这里也是相互矛盾的。我读过关于指针的内容,但由于这个着名的问题,我没有尝试过它们:

内存泄漏是否会导致我的计算机(OS X)的内存出现故障?这是永远的吗?我的意思是一大块记忆永远停滞不前。

在论坛上有人说,如果你没有释放/删除指针以释放内存,它将永远停滞不前,许多人说一个有趣的观点,即一旦你关闭你的应用程序,你的操作系统将释放所有应用程序的内存。

那么什么是好答案?因为我想用它来学习更多,但我不想永远填补我的记忆中的一些问题。

3 个答案:

答案 0 :(得分:2)

不,内存泄漏不会永远破坏您的计算机。它可以做的是让你的应用程序声明RAM不再使用,这最终可能导致这个或另一个程序在需要更多内存时崩溃,并且没有任何剩余。但是一旦退出或终止泄漏的程序,操作系统将回收内存并再次可用于任何程序。

即使操作系统有错误并且没有回收它,最坏的情况是重启会解决问题。因此,您无需担心通过尝试来破坏您的计算机,可能发生的最糟糕的情况是应用程序将崩溃。

答案 1 :(得分:0)

之所以如此强调C / C ++等语言中的内存泄漏是因为没有这样的东西称为垃圾收集器,当没有发现存在更多的引用时,它可以自动释放堆上分配的内存。

如果泄漏内存,例如代码下面(尽管它没有解决任何目的),下面的100个字节将不会被释放。

void doTest() {
char *mem =new char[100];
return;
}

如果多次调用此函数,应用程序的堆内存将继续增加,这可能最终会降低应用程序和系统的速度。此外,进一步的内存请求可能会失败,从而在应用程序中产生功能故障。

请放心,一旦你关闭应用程序,这个内存将被系统释放并回收,但是在你的应用程序运行之前,堆的大部分内容都无法使用。

答案 2 :(得分:-1)

好吧,简而言之,有点过于简单,在C ++中你可以在堆栈上创建你的对象。在这种情况下,您不必担心返回内存。在离开给定范围时,将自动调用对象的析构函数,这就是全部。

在堆栈上创建对象既快速又简单,但是堆栈内存有限,此外,您可能希望在子例程之间传递对象。这是您需要堆内存的地方。通过调用new,您需要一个内存块来保存对象的数据。你得到一个指向创建对象的指针,你可以传递它。但是,堆内存也不是无限资源。当你不再需要它时,你需要不断地返回记忆。

如果不这样做,可能会导致最终发现自己内存不足的情况。对new的每次后续调用都将导致bad_alloc异常,并且不会创建新对象。这绝对不是你想要的。因此,每个new都需要对delete进行对称调用,以确保您不会因堆内存而挨饿。

任何方式内存泄漏都不会对RAM造成物理伤害。