#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一起使用,以实现安全的循环引用。