2

我刚刚浏览了一篇解释 Wild 指针的文章。对于垃圾内存,它表示当一个指向内存对象的指针丢失时,即表示该内存项继续退出,但指向它的指针丢失了;当内存没有明确释放时会发生这种情况。我试图通过一个例子来理解这一点。这是我写的

#include <iostream>

using namespace std;
int q =12;
int point()
{
   int *p;
   p = &q;
   //delete p;
}
int main()
{
   point();
   return 0;
}

因此,在上面的示例中,内存项 (q) 继续存在,但指向它的指针丢失了。我可能完全误解了它,但如果我理解正确,那么这个例子是否解决了上面给出的“垃圾内存”定义?如果是,那么我应该使用 delete p,对吗?

4

1 回答 1

10

C ++没有您理解的垃圾收集方式。但是您所展示的不是“内存泄漏”,这就是我认为您的意思。

在这种情况下,您指向的内存位置不是动态分配的,并且在程序运行期间可以从函数外部访问。


int point()
{
   int *p = new int();
   //delete p;
}

这现在是内存泄漏,因为内存仍然被分配,但没有人可以再访问它了。如果这是 Java 或任何其他支持 GC 的语言,则该内存现在将排队等待垃圾收集


C++中推荐的风格是尽可能使用称为资源获取即初始化 (RAII)的概念使所有分配的内存自动释放,使用如下智能指针

int point()
{
   std::unique_ptr<int> p(new int());
   //delete p;  // not needed.
}

当变量 p 被销毁时,在其作用域结束时,它将自动调用delete分配的内存,因此您不必这样做。通过让东西自己清理,我们启用了以下功能。

C++ 是我最喜欢的垃圾收集语言,因为它产生的垃圾很少

Bjarne Stroustrup 的常见问题解答:你真的这么说吗?检索于 2007 年 11 月 15 日。 http://en.wikiquote.org/wiki/Bjarne_Stroustrup

于 2013-01-14T02:11:28.267 回答