首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >悬空指针与内存泄漏的区别

悬空指针与内存泄漏的区别
EN

Stack Overflow用户
提问于 2012-10-30 12:48:28
回答 4查看 109.9K关注 0票数 80

我不明白悬空指针和内存泄漏之间的区别。这两个术语有什么关系?

EN

回答 4

Stack Overflow用户

发布于 2012-10-30 12:54:41

你可以把它们看作是彼此的对立面。

当您释放一个内存区域,但仍然保留一个指向该区域的指针时,该指针就会悬空:

代码语言:javascript
复制
char *c = malloc(16);
free(c);
c[1] = 'a'; //invalid access through dangling pointer!

如果您丢失了指针,但仍保留已分配的内存,则会发生内存泄漏:

代码语言:javascript
复制
void myfunc()
{
    char *c = malloc(16);
} //after myfunc returns, the the memory pointed to by c is not freed: leak!
票数 22
EN

Stack Overflow用户

发布于 2012-10-30 12:50:47

dangling pointer是一个具有值(非NULL)的对象,它引用了一些对于您期望的对象类型无效的内存。例如,如果您设置了一个指向对象的指针,然后用其他不相关的内容覆盖该内存,或者释放内存(如果它是动态分配的)。

memory leak是指您从堆中动态分配内存,但从未释放它,这可能是因为您丢失了对它的所有引用。

它们是相关的,因为它们都是与管理不善的指针有关的情况,特别是关于动态分配的内存。在一种情况下(指针悬空),你可能释放了内存,但后来试图引用它;在另一种情况下(内存泄漏),你忘记了完全释放内存!

票数 16
EN

Stack Overflow用户

发布于 2013-07-19 14:56:26

指针有助于为变量创建用户定义的作用域,称为动态变量。动态变量可以是单变量,也可以是同类型变量组(array),也可以是不同类型变量组(struct)。默认局部变量作用域在控制进入函数时开始,在控制从该函数传出时结束。默认的全局变量作用域在程序执行时开始,在程序结束时结束。

但是由指针持有的动态变量的作用域可以在程序执行的任何点开始和结束,这必须由程序员决定。只有当程序员不处理作用域的结尾时,挂起和内存泄漏才会出现。

如果程序员没有为动态变量的作用域末尾编写代码(指针的free),就会发生内存泄漏。无论如何,一旦程序退出,整个进程内存将被释放,届时泄漏的内存也将被释放。但是对于一个长时间运行的进程来说,这会导致一个非常严重的问题。

一旦动态变量的作用域结束(释放),就应该将NULL赋值给指针变量。否则,如果代码错误地访问它,就会发生未定义的行为。所以悬空指针只是一个指向一个动态变量的指针,这个动态变量的作用域已经结束。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13132798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档