- 野指针:
- 定义:野指针是指已经指向了某块内存的指针,但是该内存区域已经被释放或者不再有效,但指针本身仍然保留该地址。
- 产生原因:
- 使用 delete 或 free 释放了指针指向的内存后,但忘记将指针置为 nullptr(C++)或 NULL(C)。
- 指向局部变量的指针,而局部变量的生命周期已经结束。
- 危险性:
- 访问野指针可能导致程序崩溃、未定义的行为,或者导致不可预测的结果,因为指针指向的内存可能已经被其他程序使用或者释放。
- 空悬指针:
- 定义:空悬指针是指指针本身合法,但指向的对象已经被销毁或者不再有效。
- 产生原因:
- 指向对象的引用,在对象被销毁后,引用仍然存在。
- 返回局部对象的指针或引用,而在函数返回后,局部对象已经不存在。
- 危险性:
- 使用空悬指针可能导致程序崩溃、未定义的行为,或者导致不可预测的结果,因为引用的对象已经不存在或者被其他数据覆盖。
例子:
#include <iostream>
int* createInt() {
int x = 5;
return &x; // 返回局部变量的指针
}
int main() {
int* ptr = createInt();
// 在这里,ptr 成为野指针,因为它指向的是已经销毁的局部变量
std::cout << *ptr << std::endl; // 可能导致未定义行为
// 其他可能导致野指针的操作
int* deletedPtr = new int;
delete deletedPtr;
std::cout << *deletedPtr << std::endl; // deletedPtr 成为野指针
// 空悬指针
int* danglingPtr = nullptr;
{
int x = 10;
danglingPtr = &x; // x 的生命周期结束后,danglingPtr 成为空悬指针
}
std::cout << *danglingPtr << std::endl; // 可能导致未定义行为
return 0;
}
© 版权声明
本站文章由不念博客原创,未经允许严禁转载!
THE END