关于std::weak_ptr, std::shared_ptr ,std::make_shared ,请用一个代码例子清晰讲解下三者直接的关系
时间: 2023-07-28 11:07:19 浏览: 167
好的,下面是一个简单的代码例子,说明三者之间的关系:
```c++
#include <iostream>
#include <memory>
class MyObject {
public:
MyObject() { std::cout << "MyObject constructed." << std::endl; }
~MyObject() { std::cout << "MyObject destructed." << std::endl; }
};
int main() {
// 使用 std::make_shared 创建 shared_ptr 对象
std::shared_ptr<MyObject> sharedPtr = std::make_shared<MyObject>();
// 创建 weak_ptr 对象,与 shared_ptr 共享同一个对象
std::weak_ptr<MyObject> weakPtr = sharedPtr;
// 使用 weak_ptr.lock() 获取 shared_ptr 对象
if (auto lockedPtr = weakPtr.lock()) {
std::cout << "Got object from weak_ptr." << std::endl;
} else {
std::cout << "Object has been destroyed." << std::endl;
}
// 重置 shared_ptr 指向的对象
sharedPtr.reset();
// 再次使用 weak_ptr.lock() 获取 shared_ptr 对象
if (auto lockedPtr = weakPtr.lock()) {
std::cout << "Got object from weak_ptr." << std::endl;
} else {
std::cout << "Object has been destroyed." << std::endl;
}
return 0;
}
```
上面的代码中,我们首先使用 std::make_shared 创建了一个 std::shared_ptr 对象 sharedPtr,它指向一个 MyObject 对象。然后,我们创建了一个 std::weak_ptr 对象 weakPtr,它与 sharedPtr 共享同一个对象。接着,我们使用 weakPtr.lock() 获取 sharedPtr 对象,并输出一条信息表示成功获取对象。然后,我们重置 sharedPtr 指向的对象,即将其置空。最后,我们再次使用 weakPtr.lock() 获取 sharedPtr 对象,并输出一条信息表示对象已经被销毁。
从上面的代码可以看出,std::weak_ptr 是用来解决 std::shared_ptr 循环引用问题的一种方式。它不会增加所指向对象的引用计数,但是可以检查所指向对象是否已经被销毁,并获取对所指向对象的共享所有权。而 std::shared_ptr 和 std::make_shared 则是用来管理动态分配的对象的,它们可以共享所指向对象的所有权,实现多个智能指针共同管理同一个对象。
阅读全文