首页 > 代码库 > c++智能指针(2)
c++智能指针(2)
weak_ptr示例
/*// 使用shred_ptr的主要原因就是避免关注指针指向的资源// 只能指针将自动释放与不再需要的对象的相关资源// 但是某些情况下,这种却不是我们需要的。// 比如 循环引用.两个对象都引用对方。// 又或者 分享一个对象 但是不占有该对象// 这个时候可以使用weak_ptr 其实相对shared_ptr 该指针不增加计数//*/#include <iostream>#include <string>#include <vector>#include <memory>using namespace std;class Person{public: string name; shared_ptr<Person> mother; shared_ptr<Person> father; vector<shared_ptr<Person>> kids; Person(const string& n, shared_ptr<Person> m = nullptr, shared_ptr<Person> f = nullptr) :name(n), mother(m), father(f){ } ~Person(){ cout << "delete " << name << endl; }};shared_ptr<Person> initFamily(const string& name){ shared_ptr<Person> mom(new Person(name + "‘s mom")); shared_ptr<Person> dad(new Person(name + "‘s dad")); shared_ptr<Person> kid(new Person(name,mom,dad)); mom->kids.push_back(kid); dad->kids.push_back(kid); return kid;}int _tmain(int argc, _TCHAR* argv[]){ shared_ptr<Person> p = initFamily("nico"); cout << "nico‘s family exists" << endl; cout << "- nico is shared " << p.use_count() << " times" << endl; cout << "- name of 1st kid of nico‘s mom: " << p->mother->kids[0]->name << endl; p = initFamily("jim"); cout << "jim‘s family exists" << endl; return 0;}
运行代码结果如下:
nico‘s family exists
- nico is shared 3 times
- name of 1st kid of nico‘s mom: nico
jim‘s family exists
请按任意键继续. . .
实际上我们并没有看到 指针指向资源的释放 这是因为在class Person 中的vector中 使用了shared_ptr 指针增加了资源的计数 所以没有及时释放
我们应该将vector这个容器改为weak_ptr 同时在使用上 weak_ptr 需要使用lock() 函数将其提升为shared_ptr
/*// 使用shred_ptr的主要原因就是避免关注指针指向的资源// 只能指针将自动释放与不再需要的对象的相关资源// 但是某些情况下,这种却不是我们需要的。// 比如 循环引用.两个对象都引用对方。// 又或者 分享一个对象 但是不占有该对象// 这个时候可以使用weak_ptr 其实相对shared_ptr 该指针不增加计数//*/#include <iostream>#include <string>#include <vector>#include <memory>using namespace std;class Person {public: string name; shared_ptr<Person> mother; shared_ptr<Person> father; vector<weak_ptr<Person>> kids; //weakpointer!!! Person(const string& n, shared_ptr<Person> m = nullptr, shared_ptr<Person> f = nullptr) : name(n), mother(m), father(f) { } ~Person() { cout << "delete " << name << endl; }};shared_ptr<Person> initFamily(const string& name){ shared_ptr<Person> mom(new Person(name + "‘s mom")); shared_ptr<Person> dad(new Person(name + "‘s dad")); shared_ptr<Person> kid(new Person(name,mom,dad)); mom->kids.push_back(kid); dad->kids.push_back(kid); return kid;}int _tmain(int argc, _TCHAR* argv[]){ shared_ptr<Person> p = initFamily("nico"); cout << "nico‘s family exists" << endl; cout << "- nico is shared " << p.use_count() << " times" << endl; cout << "- name of 1st kid of nico‘s mom: " << p->mother->kids[0].lock()->name << endl; p = initFamily("jim"); cout << "jim‘s family exists" << endl; return 0;}
运行结果如下
nico‘s family exists
- nico is shared 1 times
- name of 1st kid of nico‘s mom: nico
delete nico
delete nico‘s dad
delete nico‘s mom
jim‘s family exists
delete jim
delete jim‘s dad
delete jim‘s mom
请按任意键继续. . .
可以看到 资源正确释放
代码 改编自 C++标准库——自学教程与参考手册 英文第二版
c++智能指针(2)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。