如何避免访问已释放的地址?

mad*_*per 3 c linux memory

当我尝试访问已经释放的地址时,程序将正常运行.有些货物要避免吗?像一些名为的函数have_alloca(void *p)可以返回是否p是有效地址.
我知道valgrindtool=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++语言为您提供了灵活地访问变量地址并使用它们,代价是您负责这些地址包含变量/对象拥有的有效值.

理由是:

"拥有更大的力量带来更大的责任"

所以责任由你自己承担.


Yua*_*kun 8

p就像一个普通变量

函数free(p)的调用只是释放我们分配的内存,但p仍保留地址值.除非你自己重置:

p = NULL;

所以请记住以下提示:

  1. 每次使用指针之前,检查它是否是NULL指针.
  2. 每次释放内存后,都会为指针设置NULL.