悬空指针产生场景及规避方法
- 动态内存释放后未置空指针
- 产生场景:使用
delete
或delete[]
释放动态分配的内存后,指针未被设置为nullptr
。例如:
int* ptr = new int(5);
delete ptr;
// 此时ptr成为悬空指针,若继续使用ptr会导致未定义行为
- **规避方法**:释放内存后立即将指针置为`nullptr`。
int* ptr = new int(5);
delete ptr;
ptr = nullptr;
- 函数局部变量指针返回
- 产生场景:函数内局部变量在栈上分配,函数返回其指针,函数结束后局部变量被销毁,指针变为悬空指针。例如:
int* getLocalPtr() {
int num = 10;
return #
}
// 调用getLocalPtr()后返回的指针是悬空指针
- **规避方法**:改为返回动态分配的内存指针,并在使用完后正确释放。或者使用智能指针来管理动态内存。
std::unique_ptr<int> getDynamicPtr() {
return std::make_unique<int>(10);
}
- 对象生命周期结束,但其指针仍被保留
- 产生场景:当对象在栈上创建,作用域结束对象被销毁,但指向它的指针仍存在。例如:
class MyClass {};
void func() {
MyClass obj;
MyClass* ptr = &obj;
}
// 函数func结束后,ptr成为悬空指针
- **规避方法**:使用智能指针来管理对象生命周期。若需要在函数外访问对象,可使用动态分配方式创建对象并由智能指针管理。
class MyClass {};
std::unique_ptr<MyClass> createMyClass() {
return std::make_unique<MyClass>();
}