std::unique_ptr
- 影响:
std::unique_ptr
拥有对象的唯一所有权。当 std::unique_ptr
离开其作用域时,会立即调用所管理对象的析构函数。不存在析构函数延迟调用的情况(除非手动 reset
或 release
等操作改变所有权)。
- 代码示例:
#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。当 ptr1
和 ptr2
所在的块结束时,它们都被销毁,引用计数减为 0,此时才调用 MyClass
的析构函数,输出 MyClass destructor called
,之后输出 After shared_ptr scope
。