MST

星途 面试题库

面试题:C++中悬空指针产生的常见场景及规避方法

请简述在C++编程中,悬空指针通常会在哪些场景下产生,并针对每个场景说明至少一种有效的规避方法。
23.0万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

悬空指针产生场景及规避方法

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