weakptr用法举例
时间: 2024-05-09 09:19:47 浏览: 41
weakptr是C++11引入的一种智能指针,用于解决shared_ptr存在的循环引用问题,它不会增加引用计数,也不会导致内存泄漏。下面举个例子来说明它的用法。
假设我们有一个Person类和一个Car类,其中Person类包含一个指向Car类的shared_ptr指针,而Car类包含一个指向Person类的weak_ptr指针。代码如下:
```c++
#include <iostream>
#include <memory>
class Person;
class Car {
public:
Car() { std::cout << "Car constructed" << std::endl; }
~Car() { std::cout << "Car destructed" << std::endl; }
void setOwner(std::shared_ptr<Person> person) {
owner = person;
}
private:
std::weak_ptr<Person> owner;
};
class Person {
public:
Person() { std::cout << "Person constructed" << std::endl; }
~Person() { std::cout << "Person destructed" << std::endl; }
void setCar(std::shared_ptr<Car> car) {
this->car = car;
car->setOwner(shared_from_this());
}
private:
std::shared_ptr<Car> car;
};
int main() {
std::shared_ptr<Person> person = std::make_shared<Person>();
std::shared_ptr<Car> car = std::make_shared<Car>();
person->setCar(car);
return 0;
}
```
在上面的代码中,我们创建了一个Person对象和一个Car对象,并将它们关联起来。具体来说,我们通过调用setCar方法,将Person对象的shared_ptr指针和Car对象的shared_ptr指针绑定在一起,同时在setCar方法中,我们通过调用shared_from_this方法获取了Person对象的shared_ptr指针,然后将它传递给Car对象的setOwner方法,setOwner方法中将这个shared_ptr指针包装成了一个weak_ptr指针,并将它赋值给了Car对象的owner成员变量。
这种关联关系可以形成一个循环引用,也就是Person对象的shared_ptr指针持有Car对象的shared_ptr指针,而Car对象的weak_ptr指针又持有Person对象的shared_ptr指针。如果我们使用shared_ptr指针来解决这个问题,那么就会出现内存泄漏的问题,因为它们之间的引用计数永远不会变成0。
使用weak_ptr指针就可以避免这个问题。因为weak_ptr指针不会增加引用计数,所以即使Person对象的shared_ptr指针被销毁,Car对象的weak_ptr指针也不会影响Person对象的生命周期。同时,我们可以通过lock方法来获取weak_ptr指针所指向的对象的shared_ptr指针,如果对象被销毁了,那么lock方法将返回一个空的shared_ptr指针。在实际使用中,我们可以通过检查lock方法返回的shared_ptr指针是否为空,来判断对象是否已经被销毁了。
阅读全文