MST

星途 面试题库

面试题:C++ 中指针初始化避免野指针的常见方法

在C++编程中,为了避免产生野指针,简述指针初始化的几种常见策略及其适用场景。
46.3万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

1. 初始化为 nullptr

  • 策略:在声明指针时,将其初始化为 nullptrnullptr 是 C++11 引入的关键字,用于表示空指针,它能明确指出指针不指向任何有效的对象。
  • 适用场景:适用于所有指针声明场景,特别是当暂时不确定指针要指向何处时。比如在类的成员指针声明时,在构造函数中还未对其进行有效赋值前,可先初始化为 nullptr。例如:
class Example {
private:
    int* ptr;
public:
    Example() : ptr(nullptr) {}
};

2. 初始化指向栈上分配的对象

  • 策略:使用栈上定义的变量地址来初始化指针。例如,定义一个局部变量,然后让指针指向它。
  • 适用场景:当需要指针指向一个在函数局部作用域内有效的对象,且生命周期与函数调用相关时适用。比如在一个函数内部,需要临时操作一个对象,通过指针来访问它。例如:
void func() {
    int num = 10;
    int* ptr = #
    // 对 ptr 指向的对象进行操作
}

3. 初始化指向堆上分配的对象(使用 new 运算符)

  • 策略:使用 new 运算符在堆上分配内存,并将返回的地址赋值给指针。
  • 适用场景:当需要动态分配内存,且对象的生命周期需要手动管理(通过 delete 释放)时使用。比如在实现一些动态数据结构,如链表、树等,节点通常在堆上分配。例如:
int* ptr = new int(20);
// 使用完后记得释放内存
delete ptr;

4. 使用智能指针

  • 策略
    • std::unique_ptr:采用独占式所有权语义,当 std::unique_ptr 离开其作用域时,会自动释放其所指向的对象。例如:std::unique_ptr<int> ptr(new int(30));
    • std::shared_ptr:采用引用计数机制,多个 std::shared_ptr 可以指向同一个对象,当引用计数为 0 时,对象自动被释放。例如:std::shared_ptr<int> ptr1 = std::make_shared<int>(40);
    • std::weak_ptr:它是一种弱引用,指向由 std::shared_ptr 管理的对象,但不影响对象的引用计数。常用于解决 std::shared_ptr 的循环引用问题。例如:
std::shared_ptr<int> ptr2 = std::make_shared<int>(50);
std::weak_ptr<int> weakPtr = ptr2;
  • 适用场景
    • std::unique_ptr:适用于需要明确单个对象所有权的场景,如函数返回一个动态分配的对象,且调用者负责对象的生命周期。
    • std::shared_ptr:适用于多个地方可能需要访问同一个动态分配对象的场景,且对象的生命周期由所有引用它的 std::shared_ptr 共同管理。
    • std::weak_ptr:适用于需要检测对象是否存在,但又不想影响其生命周期的场景,如在缓存系统中,避免循环引用导致内存泄漏。