MST

星途 面试题库

面试题:C++中std::unique_ptr管理数组的复杂场景

假设有一个类MyClass,它有一个构造函数和一个析构函数用于资源的初始化和释放。现在需要使用std::unique_ptr管理MyClass类型的数组,数组大小根据用户输入动态确定。要求在程序中展示如何正确初始化数组元素,并且在程序结束时确保所有资源都被正确释放。同时说明在这种场景下,std::unique_ptr相较于std::shared_ptr管理数组的优势和劣势。
25.1万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
#include <iostream>
#include <memory>

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

int main() {
    int size;
    std::cout << "请输入数组大小: ";
    std::cin >> size;

    // 使用std::unique_ptr管理MyClass类型的数组
    std::unique_ptr<MyClass[]> myArray(new MyClass[size]);

    // 可以在这里对数组元素进行初始化等操作
    for (int i = 0; i < size; ++i) {
        // 例如这里可以调用MyClass的成员函数进行初始化
    }

    // 程序结束时,std::unique_ptr会自动调用MyClass数组中每个元素的析构函数,释放资源
    return 0;
}

std::unique_ptr相较于std::shared_ptr管理数组的优势

  1. 性能优势
    • std::unique_ptr 没有引用计数的开销。std::shared_ptr 使用引用计数来跟踪有多少个指针指向同一个对象,每次复制、赋值或销毁 std::shared_ptr 时都需要更新引用计数,这涉及原子操作,会带来一定的性能损耗。而 std::unique_ptr 只在对象所有权转移时进行简单的指针赋值,性能更高。
  2. 内存占用少
    • std::unique_ptr 通常只占用一个指针的大小,而 std::shared_ptr 除了指针本身外,还需要额外的空间来存储引用计数和可能的控制块,所以 std::unique_ptr 内存占用更小。

std::unique_ptr相较于std::shared_ptr管理数组的劣势

  1. 共享性差
    • std::unique_ptr 不支持对象所有权的共享,一旦 std::unique_ptr 被销毁,其所管理的对象也会被销毁。而 std::shared_ptr 允许多个指针共享同一个对象的所有权,适用于需要在多个地方共享资源的场景。如果程序逻辑需要在多个地方同时使用同一个数组资源,std::unique_ptr 就无法满足需求,只能使用 std::shared_ptr