#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管理数组的优势
- 性能优势:
std::unique_ptr
没有引用计数的开销。std::shared_ptr
使用引用计数来跟踪有多少个指针指向同一个对象,每次复制、赋值或销毁 std::shared_ptr
时都需要更新引用计数,这涉及原子操作,会带来一定的性能损耗。而 std::unique_ptr
只在对象所有权转移时进行简单的指针赋值,性能更高。
- 内存占用少:
std::unique_ptr
通常只占用一个指针的大小,而 std::shared_ptr
除了指针本身外,还需要额外的空间来存储引用计数和可能的控制块,所以 std::unique_ptr
内存占用更小。
std::unique_ptr相较于std::shared_ptr管理数组的劣势
- 共享性差:
std::unique_ptr
不支持对象所有权的共享,一旦 std::unique_ptr
被销毁,其所管理的对象也会被销毁。而 std::shared_ptr
允许多个指针共享同一个对象的所有权,适用于需要在多个地方共享资源的场景。如果程序逻辑需要在多个地方同时使用同一个数组资源,std::unique_ptr
就无法满足需求,只能使用 std::shared_ptr
。