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

What is the difference between a dangling pointer and memory leak?

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

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

一个悬挂指针是一个指向没有对象驻留的地址的指针。 IE。它指向无效内存。 "dangling" 这个词通常带有这样的含义,它曾经指向一些有效的东西并且某些东西被破坏了(因为它被明确地释放了或者因为它超出了范围)。

A 内存泄漏 发生在您丢失动态分配的内存块的所有轨道时;也就是说,当您 "forget" 指向该内存的最后一个指针时,这意味着您无法再释放它。如果您在调用 delete[] n;.

之前执行 n = nullptr;,您的代码将造成内存泄漏

如果我不得不用这两个术语中的一个来描述你的情况,那将是"dangling pointer,"只是因为你在上一次迭代中超出了缓冲区.但是,我通常不会将其称为 "dangling pointer,",因为它一开始就无效。我会称之为 "buffer overrun" 或 "out-of-bounds access."

让我们先做一些典型的例子:

内存泄漏

int *x;
x = new int;
x = nullptr;

我们在堆上分配了一个整数,然后我们就找不到它了。此时我们无法对该整数调用 delete 。这是内存泄漏。

悬挂指针

int *x;
x = new int;
delete x;

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

您的代码

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

int *x;
x = new int[10];
x[9] = x[10];

我认为这两种情况都不是。这是缓冲区溢出。

What is the difference between a dangling pointer and memory leak?

您可以说悬挂指针与内存泄漏相反。

一个是没有指向有效内存的指针,一个是没有指向任何内容的有效内存。

(但正如其他答案所指出的,您的代码两者都不是。)