#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_ptr
:shared_ptr
使用引用计数来管理动态分配的对象的内存。当引用计数为 0 时,对象将被自动删除。多个shared_ptr
可以共享同一个对象的所有权,因此可以安全地在多个线程之间共享对象。
2.
unique_ptr
:unique_ptr
拥有对象的所有权,并且不允许共享所有权。当unique_ptr
超出范围时,对象将被自动删除。unique_ptr
适用于单个所有者的情况,例如在单线程环境中。
3.
weak_ptr
:weak_ptr
是一种引用计数智能指针,它不会增加对象的引用计数。weak_ptr
可以用来监视对象的存在,但不能直接操作对象。当对象被删除时,weak_ptr
将变为空指针。weak_ptr
通常与shared_ptr
一起使用,以实现安全的循环引用。
标签:std,DoSomething,weak,shared,unique,ptr From: https://www.cnblogs.com/music-liang/p/18048787