当我尝试访问已经释放的地址时,程序将正常运行.有些货物要避免吗?像一些名为的函数have_alloca(void *p)可以返回是否p是有效地址.
我知道valgrind有tool=memcheck能做到这一点.但我想知道我是否可以从代码中避免它.
这是一个简单的例子:
#include <stdlib.h>
int main(int argc, char *argv[])
{
int *p = malloc(sizeof(int) * 10);
free(p);
*(p + 1) = 100;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么我可以访问无效地址?程序可以编译运行,没有任何警告.顺便说一句:Linux.
Alo*_*ave 11
不,你必须自己照顾好这个.
从技术上讲,从语言标准的角度来看,写入不属于您的内存位置是未定义行为.
C和C++语言为您提供了灵活地访问变量地址并使用它们,代价是您负责这些地址包含变量/对象拥有的有效值.
理由是:
"拥有更大的力量带来更大的责任"
所以责任由你自己承担.
p就像一个普通变量
函数free(p)的调用只是释放我们分配的内存,但p仍保留地址值.除非你自己重置:
p = NULL;
所以请记住以下提示: