MST

星途 面试题库

面试题:C++ 智能指针与析构函数延迟调用

假设有一个类 `MyClass`,在使用智能指针管理 `MyClass` 对象时,分析智能指针的不同类型(如 `std::unique_ptr`、`std::shared_ptr`)对 `MyClass` 析构函数延迟调用可能产生的影响,并给出相应的代码示例及详细解释。
32.9万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

std::unique_ptr

  • 影响std::unique_ptr 拥有对象的唯一所有权。当 std::unique_ptr 离开其作用域时,会立即调用所管理对象的析构函数。不存在析构函数延迟调用的情况(除非手动 resetrelease 等操作改变所有权)。
  • 代码示例
#include <iostream>
#include <memory>

class MyClass {
public:
    ~MyClass() {
        std::cout << "MyClass destructor called" << std::endl;
    }
};

int main() {
    {
        std::unique_ptr<MyClass> ptr = std::make_unique<MyClass>();
        // 这里当ptr离开作用域(即大括号结束),MyClass的析构函数立即调用
    }
    std::cout << "After unique_ptr scope" << std::endl;
    return 0;
}
  • 解释:在上述代码中,std::unique_ptr<MyClass> ptr = std::make_unique<MyClass>(); 创建了一个 MyClass 对象并由 ptr 唯一拥有。当 ptr 所在的块结束时,MyClass 的析构函数马上被调用,输出 MyClass destructor called。之后才输出 After unique_ptr scope

std::shared_ptr

  • 影响std::shared_ptr 允许多个指针共享对象的所有权。只有当最后一个指向对象的 std::shared_ptr 被销毁(即引用计数变为 0)时,才会调用对象的析构函数。这可能导致析构函数的调用延迟,因为只要还有其他 std::shared_ptr 指向该对象,析构函数就不会执行。
  • 代码示例
#include <iostream>
#include <memory>

class MyClass {
public:
    ~MyClass() {
        std::cout << "MyClass destructor called" << std::endl;
    }
};

int main() {
    {
        std::shared_ptr<MyClass> ptr1 = std::make_shared<MyClass>();
        std::shared_ptr<MyClass> ptr2 = ptr1; // ptr2和ptr1共享MyClass对象的所有权
        // 此时MyClass对象的引用计数为2
    } // 这里ptr1和ptr2离开作用域,引用计数减为0,MyClass的析构函数调用
    std::cout << "After shared_ptr scope" << std::endl;
    return 0;
}
  • 解释std::shared_ptr<MyClass> ptr1 = std::make_shared<MyClass>(); 创建了一个 MyClass 对象并由 ptr1 持有,此时引用计数为 1。std::shared_ptr<MyClass> ptr2 = ptr1; 使 ptr2 也指向该对象,引用计数变为 2。当 ptr1ptr2 所在的块结束时,它们都被销毁,引用计数减为 0,此时才调用 MyClass 的析构函数,输出 MyClass destructor called,之后输出 After shared_ptr scope