C语言动态内存分配的深入解析
悬空指针与内存状态
悬空指针可能导致释放后使用漏洞(CWE 416),当悬空指针传递给 free 函数时,还会导致双重释放漏洞(CWE 415)。为了减少悬空指针带来的问题,可以在调用 free 函数后将指针设置为 nullptr 。示例代码如下:
char *ptr = malloc(16);
// --snip--
free(ptr);
ptr = nullptr;
这样,后续任何对该指针的解引用操作通常会导致程序崩溃,从而在实现和测试阶段更容易检测到错误。而且,将指针设置为 nullptr 后,多次释放该指针指向的内存不会产生后果。不过, free 函数本身无法将指针设置为 nullptr ,因为它接收的是指针的副本而非实际指针。
动态分配的内存有三种状态:
- 未分配且未初始化:不可读、不可写、不可释放。
- 已分配但未初始化:可写、可释放,但不可读。
- 已分配且已初始化:可读、可写、可释放。
不同的内存状态对应不同的有效操作,应避免对内存进行无效操作。例如,执行以下代码:
char *p = malloc(100);
memset(p, 0, 50);
前50个字节已分配且已初始化,可读取;而后50个字节已分配但未初
超级会员免费看
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



