[C++11]_[初级]_[weak_ptr的使用场景]
2016-03-04 00:52
453 查看
场景
弱引用特性,不拥有对象,只有延迟到尝试调用Lock()时才会有可能临时拥有对象:只是持有一个没有拥有权的被shared_ptr托管的对象.
只有调用lock()创建shared_ptr指针时才会引用实际对象.
在lock()成功时会延长shared_ptr对象的生命周期,因为它递增了一个引用计数.
在shared_ptr主指针结束后,如果std::weak_ptr的lock()成功的指针还存在,那么这时候还有lock()的代码调用,引用计数仍然递增.
经常用在解除循环引用问题.看以下例子如果Man和Woman各自包含一个std::shared_ptr,那么就会出现内存泄漏,因为Woman,Main的计数实际是2.Woman成员变量是必须是Woman的析构调用后才会调用,而Woman的析构必须是引用计数为0时才会调用,这导致成员变量Man一直没有析构.
例子1:std::shared_ptr 和 std::weak_ptr的用法以及引用计数的循环引用问题
用于在延迟使用主导权的场景, 比如线程A是重要,A完成之后B,C线程可做可不做.这时候B,C就可以使用weak_ptr指针来控制.
参考
std::weak_ptr例子2
[code]#include <iostream> #include <memory> std::weak_ptr<int> gw; void f() { if (auto spt = gw.lock()) { // Has to be copied into a shared_ptr before usage std::cout << *spt << "\n"; } else { std::cout << "gw is expired\n"; } } void TestWeakPtrScope_1() { std::cout << "TestWeakPtrScope_1" << std::endl; std::shared_ptr<int> sp1; { auto sp = std::make_shared<int>(42); gw = sp; f(); sp1 = gw.lock(); } f(); } void TestWeakPtrScope_2() { std::cout << "TestWeakPtrScope_2" << std::endl; std::shared_ptr<int> sp1; { auto sp = std::make_shared<int>(42); gw = sp; f(); } f(); } int main() { TestWeakPtrScope_1(); TestWeakPtrScope_2(); }
输出:
[code]TestWeakPtrScope_1 42 42 TestWeakPtrScope_2 42 gw is expired
相关文章推荐
- C/C++程序员必须熟练应用的开源项目
- C++封装继承多态总结
- C++ 虚函数 重载 重写的区别(转)
- C语言实现栈
- C语言实现二叉树并且实现二叉树的遍历
- 《Effective C++》学习笔记——条款40
- 双向链表的C++实现
- C++中关于类(封装、继承、多态)区别于结构体的理解
- C++ LNK 2001 LNK 2019 LNK 2028 LNK 2029链接错误
- 动态内存分配(c语言)
- [C++11]_[初级]_[unique_ptr的使用场景]
- [C++11]_[初级]_[unique_ptr的使用场景]
- c、OC、C++的三种预处理功能
- 嵌入式C语言常见面试题分析
- C语言的结构体和C++结构体的区别
- 1097. Deduplication on a Linked List (25)
- 重学C++ (十二) 模板特化和偏特化
- C++中虚函数功能的实现机制
- 面向对象程序设计-复习C++
- 利用C语言结构体模拟一个简单的JavaBean