shared_ptr, unique_ptr,weak_ptr

#include <iostream>
#include <memory>

class MyClass {
public:
 MyClass() {
 std::cout << "MyClass constructed" << std::endl;
 }

 ~MyClass() {
 std::cout << "MyClass destructed" << std::endl;
 }

 void DoSomething() {
 std::cout << "Doing something" << std::endl;
 }
};

int main() {
 // 使用 shared_ptr
 std::shared_ptr<MyClass> ptr1 = std::make_shared<MyClass>();
 ptr1->DoSomething();

 // 使用 unique_ptr
 std::unique_ptr<MyClass> ptr2 = std::make_unique<MyClass>();
 ptr2->DoSomething();

 // 使用 weak_ptr
 std::weak_ptr<MyClass> ptr3 = ptr1;
 if (std::shared_ptr<MyClass> ptr4 = ptr3.lock()) {
 ptr4->DoSomething();
 }

 return 0;
}
在这个示例中,我们创建了一个名为MyClass的类,它有一个构造函数和一个析构函数,以及一个DoSomething方法。然后,在main函数中,我们使用std::make_shared<MyClass>创建了一个shared_ptr,并调用了它的DoSomething方法。接下来,我们使用std::make_unique<MyClass>创建了一个unique_ptr,并调用了它的DoSomething方法。最后,我们使用ptr1创建了一个weak_ptr,并通过lock方法获取了一个shared_ptr,然后调用了它的DoSomething方法。

 

下面是对这三种智能指针的区别的解释:

 

1.shared_ptrshared_ptr使用引用计数来管理动态分配的对象的内存。当引用计数为 0 时,对象将被自动删除。多个shared_ptr可以共享同一个对象的所有权,因此可以安全地在多个线程之间共享对象。

 

2.unique_ptrunique_ptr拥有对象的所有权,并且不允许共享所有权。当unique_ptr超出范围时,对象将被自动删除。unique_ptr适用于单个所有者的情况,例如在单线程环境中。

 

3.weak_ptrweak_ptr是一种引用计数智能指针,它不会增加对象的引用计数。weak_ptr可以用来监视对象的存在,但不能直接操作对象。当对象被删除时,weak_ptr将变为空指针。weak_ptr通常与shared_ptr一起使用,以实现安全的循环引用。

 

posted @ 2024-03-02 16:31  He_LiangLiang  阅读(3)  评论(0编辑  收藏  举报