悬空指针和内存泄漏有什么区别?

Sye*_*hab 5 memory-leaks dynamic-allocation c++11 dangling-pointer

我是C++的新手,想问下面的代码是否是悬空指针或内存泄漏的一个例子,因为它指向动态分配的数组:

int * n = new int[10];
for (int prev = 0; prev < 10; prev++) {
    *n = *(n + prev + 1);
}
delete[] n;
n = nullptr;
Run Code Online (Sandbox Code Playgroud)

Rei*_*ica 13

悬挂指针是指向到没有对象驻留的地址的指针.即它指向无效的记忆."悬空"这个词通常带有以下内涵:它曾经指向有效的东西,而某些东西被摧毁(要么是因为它被明确解除分配,要么因为它超出了范围).

一个内存泄漏,当你失去动态分配的内存块的所有轨道发生; 也就是说,当你"忘记"指向该内存的最后一个指针时,意味着你不能再解除分配它.如果n = nullptr;在打电话之前,您的代码会产生内存泄漏delete[] n;.

如果我不得不用这两个术语中的一个来描述你的情况,那就是"悬挂指针",只是因为你在最后一次迭代中超越了缓冲区.但是,我通常不会称之为"悬空指针",因为它首先从未有效.我称之为"缓冲区溢出"或"越界访问".


Jon*_*ely 8

悬空指针和内存泄漏有什么区别?

你可以说悬空指针与内存泄漏相反.

一个是指向有效内存的指针,一个是没有指向的有效内存.

(但正如其他答案指出的那样,你的代码都不是.)


Bil*_*nch 6

让我们先做一些规范的例子:

内存泄漏

int *x;
x = new int;
x = nullptr;
Run Code Online (Sandbox Code Playgroud)

我们在堆上分配了一个整数,然后我们丢失了它的跟踪.此时我们无法调用delete该整数.这是内存泄漏.

悬挂指针

int *x;
x = new int;
delete x;
Run Code Online (Sandbox Code Playgroud)

x现在是一个悬垂的指针.它指向曾经是有效记忆的东西.如果我们*x在这一点上使用,我们将访问我们不应该访问的内存.通常,为了解决这个问题delete x;,我们做到了x = nullptr;

你的代码

您的代码有一个不同的问题,我将减少您的代码,以便我们可以更轻松地谈论同样的事情:

int *x;
x = new int[10];
x[9] = x[10];
Run Code Online (Sandbox Code Playgroud)

我将此描述为以上两种情况.这是缓冲区溢出.