什么是野指针?
野指针(Dangling Pointer) 是指向已经被释放或无效内存地址的指针。它指向的内存可能已被回收、重新分配,甚至被其他程序占用。使用野指针会导致不可预知的行为,包括程序崩溃、数据损坏或安全漏洞。
野指针的常见成因:
释放内存后未置空:
int *p = malloc(sizeof(int));
free(p); // p 成为野指针,仍指向已释放的内存
*p = 10; // 危险操作!
函数返回局部变量的地址:
int* getLocalVar() {
int x = 5;
return &x; // x 在函数返回后被销毁,返回的指针是野指针
}
指针越界后未更新
int arr[5] = {1, 2, 3, 4, 5};
int *p = arr;
p += 10; // p 越界,指向未知内存
多线程竞争释放内存:
比如:线程A释放了指针p指向的内存
线程B未同步,继续使用p → 野指针
如何避免野指针?
1. 释放后立即置空
在释放指针指向的内存后,立即将指针设为 NULL(C/C++)或 nullptr(C++11+)。
int *p = malloc(sizeof(int));
free(p);
p = NULL; // 置空后,任何对*p的操作都会触发段错误,便于调试
2. 使用智能指针(C++)
std::unique_ptr:独占所有权,自动释放内存。
std::shared_ptr:共享所有权,引用计数归零时释放内存。
3. 避免返回局部变量地址
若需返回堆内存,使用动态分配(malloc/new)并确保调用者负责释放。
int* createInt() {
int *p = malloc(sizeof(int));
*p = 5;
return p; // 调用者需手动 free(p)
}
4. 使用静态分析工具
Valgrind:检测内存泄漏和野指针。
Clang Static Analyzer:静态代码分析工具,识别潜在问题。
6064

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



