Vij*_*jay 23 c c++ free memory-leaks memory-management
在C和C++中,释放空指针将导致无法完成任务.
不过,我看到人们说如果你"两次释放内存"会导致内存损坏.
这是真的?当你释放记忆两次时,引擎盖下发生了什么?
N 1*_*1.1 23
int *p = malloc(sizeof(int));
//value of p is now lets say 0x12345678
*p = 2;
free(p); //memory pointer is freed, but still value of p is 0x12345678
//now, if you free again, you get a crash or undefined behavior.
Run Code Online (Sandbox Code Playgroud)
所以,在free第一次之后,你应该这样做p = NULL,所以如果(任何机会)free(p)再次被召唤,什么都不会发生.
这就是为什么释放两次内存是未定义的:为什么在调用两次时自由崩溃
小智 19
释放内存不会将指针设置为null.指针仍然指向它曾经拥有的内存,但现在已将所有权转移回堆管理器.
从那以后,堆管理器可能已经重新分配了陈旧指针所指向的内存.
再次释放它与说法不同free(NULL),并将导致未定义的行为.
这是未定义的行为,可能导致堆损坏或其他严重后果.
free()对于空指针,只需检查内部的指针值并返回.该检查无助于两次释放一个块.
这是通常发生的事情.堆实现获取地址并尝试通过修改自己的服务数据来"占用"该块的块.根据堆实现,任何事情都可能发生.也许它有效并且没有任何反应,也许服务数据已损坏并且您有堆损坏.
所以不要这样做.这是未定义的行为.无论发生什么坏事.
为了避免两次释放,我总是使用 MACRO 来释放内存:
#ifdef FREEIF
# undef FREEIF
#endif
#define FREEIF( _p ) \
if( _p ) \
{ \
free( _p ); \
_p = NULL; \
}
Run Code Online (Sandbox Code Playgroud)
该宏设置 p = NULL 以避免悬空指针。
| 归档时间: |
|
| 查看次数: |
12725 次 |
| 最近记录: |