什么是野指针?怎样避免?

什么是野指针?

野指针(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:静态代码分析工具,识别潜在问题。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值