5

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

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

3 回答 3

14

悬空指针是指向没有对象所在的地址的指针。即它指向无效的内存。“悬空”一词通常带有这样的含义:它曾经指向有效的东西并且某些东西被破坏(因为它被显式地释放或因为它超出了范围)。

当您丢失所有动态分配的内存时,就会发生内存泄漏;也就是说,当您“忘记”指向该内存的最后一个指针时,这意味着您不能再释放它。如果您n = nullptr;在调用delete[] n;.

如果我不得不用这两个术语之一来描述您的情况,那将是“悬空指针”,这仅仅是因为您在上一次迭代中超出了缓冲区。但是,我通常不会将其称为“悬空指针”,因为它从一开始就不是有效的。我将其称为“缓冲区溢出”或“越界访问”。

于 2015-03-14T14:30:57.277 回答
9

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

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

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

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

于 2015-03-14T15:42:46.470 回答
6

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

内存泄漏

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];

我将其描述为上述两种情况都不是。这是缓冲区溢出。

于 2015-03-14T15:34:08.023 回答