C++11 悬空指针和内存泄漏有什么区别? 我是C++的新手,想问一下下面的代码是一个悬空指针或内存泄漏的例子,因为它指向动态分配的数组之外: int * n = new int[10]; for (int prev = 0; prev < 10; prev++) { *n = *(n + prev + 1); } delete[] n; n = nullptr; int*n=新的int[10]; 对于(int-prev=0;prev

C++11 悬空指针和内存泄漏有什么区别? 我是C++的新手,想问一下下面的代码是一个悬空指针或内存泄漏的例子,因为它指向动态分配的数组之外: int * n = new int[10]; for (int prev = 0; prev < 10; prev++) { *n = *(n + prev + 1); } delete[] n; n = nullptr; int*n=新的int[10]; 对于(int-prev=0;prev,c++11,memory-leaks,dynamic-allocation,dangling-pointer,C++11,Memory Leaks,Dynamic Allocation,Dangling Pointer,悬空指针是指向没有对象驻留的地址的指针。即,它指向无效内存。“悬挂”一词通常具有这样的含义:它用来指某个有效的东西和某个被破坏的东西(要么是因为它被明确地释放了,要么是因为它超出了范围) 当您丢失动态分配的内存段的所有轨道时,就会发生内存泄漏;也就是说,当您“忘记”指向该内存的最后一个指针时,意味着您无法再释放它。如果执行n=nullptr,则代码将产生内存泄漏在调用之前删除[]n 如果我必须用这两个术语中的一个来描述您的情况,那将是“悬空指针”,因为您在上一次迭代中到达了缓冲区之外。然而,我通

悬空指针是指向没有对象驻留的地址的指针。即,它指向无效内存。“悬挂”一词通常具有这样的含义:它用来指某个有效的东西和某个被破坏的东西(要么是因为它被明确地释放了,要么是因为它超出了范围)

当您丢失动态分配的内存段的所有轨道时,就会发生内存泄漏;也就是说,当您“忘记”指向该内存的最后一个指针时,意味着您无法再释放它。如果执行
n=nullptr,则代码将产生内存泄漏在调用之前
删除[]n


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

让我们先做一些规范性示例:

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

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

你的代码 您的代码有一个不同的问题,我将把您的代码简化为,这样我们就可以更轻松地讨论相同的问题:

int *x;
x = new int[10];
x[9] = x[10];
我认为这不是上述两种情况。这是缓冲区溢出

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


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

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


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

悬空指针是指不指向任何特殊位置或未分配内存的指针。例如,可以通过分配内存,然后扔掉指向已分配内存的指针,使其不再可访问来造成内存泄漏。可以说,悬空指针与内存泄漏相反。一个是不指向有效内存的指针,另一个是没有任何东西指向的有效内存。@JonathanWakely:这似乎是一个好的、简洁的答案!:)@LightnessRacesinOrbit,正如Angew所说,这个代码并没有真正演示其中任何一个,所以我将回答问题标题,但不是身体:)@JonathanWakely:True。尽管如此,失去这颗宝石还是很遗憾,因为它在评论中!我认为值得指出的是,在悬空指针的示例中,
x
仅是显示的代码之后的悬空指针,并且仅当您取消引用它时。我想再添加一行,如
*x=42
,指出在此上下文中,
x
现在是一个悬空指针。
x
*x=42之前的悬空指针,我敢肯定你也知道。在这两个例子中,我都是在所示的代码块之后谈论
x
。我知道,但我不确定这对于像OP这样提出问题的人来说是显而易见的:)你添加的“现在”更清楚。这是最简单最恰当的解释。我向你保证,我再也不会困惑了!好了,现在一切都清楚了。谢谢你的帮助。
int *x;
x = new int;
delete x;
int *x;
x = new int[10];
x[9] = x[10];