C++11特性 - Smart Pointers 智能指针
来源:互联网 发布:逻辑门电路实验数据 编辑:程序博客网 时间:2024/05/17 20:21
已经有成千上万的文章讨论这个问题了,所以我只想说:现在能使用的,带引用计数,并且能自动释放内存的智能指针包括以下几种:
unique_ptr: 如果内存资源的所有权不需要共享,就应当使用这个(它没有拷贝构造函数),但是它可以转让给另一个unique_ptr(存在move构造函数)。
shared_ptr: 如果内存资源需要共享,那么使用这个(所以叫这个名字)。
weak_ptr: 持有被shared_ptr所管理对象的引用,但是不会改变引用计数值。它被用来打破依赖循环(想象在一个tree结构中,父节点通过一个共享所有权的引用(chared_ptr)引用子节点,同时子节点又必须持有父节点的引用。如果这第二个引用也共享所有权,就会导致一个循环,最终两个节点内存都无法释放)。
另一方面,auto_ptr已经被废弃,不会再使用了。
什么时候使用unique_ptr,什么时候使用shared_ptr取决于对所有权的需求,我建议阅读以下的讨论:http://stackoverflow.com/questions/15648844/using-smart-pointers-for-class-members
unique_ptr: 如果内存资源的所有权不需要共享,就应当使用这个(它没有拷贝构造函数),但是它可以转让给另一个unique_ptr(存在move构造函数)。
shared_ptr: 如果内存资源需要共享,那么使用这个(所以叫这个名字)。
weak_ptr: 持有被shared_ptr所管理对象的引用,但是不会改变引用计数值。它被用来打破依赖循环(想象在一个tree结构中,父节点通过一个共享所有权的引用(chared_ptr)引用子节点,同时子节点又必须持有父节点的引用。如果这第二个引用也共享所有权,就会导致一个循环,最终两个节点内存都无法释放)。
另一方面,auto_ptr已经被废弃,不会再使用了。
什么时候使用unique_ptr,什么时候使用shared_ptr取决于对所有权的需求,我建议阅读以下的讨论:http://stackoverflow.com/questions/15648844/using-smart-pointers-for-class-members
以下第一个例子使用了unique_ptr。如果你想把对象所有权转移给另一个unique_ptr,需要使用std::move。在所有权转移后,交出所有权的智能指针将为空,get()函数将返回nullptr。
void foo(int* p){std::cout << *p << std::endl;}std::unique_ptr<int> p1(new int(42));std::unique_ptr<int> p2 = std::move(p1); // transfer ownership if(p1)foo(p1.get()); (*p2)++; if(p2)foo(p2.get());第二个例子展示了shared_ptr。用法相似,但语义不同,此时所有权是共享的。
void foo(int* p){}void bar(std::shared_ptr<int> p){++(*p);}std::shared_ptr<int> p1(new int(42));std::shared_ptr<int> p2 = p1; bar(p1);foo(p2.get());第一个声明和以下这行是等价的:
auto p3 = std::make_shared<int>(42);make_shared<T>是一个非成员函数,使用它的好处是可以一次性分配共享对象和智能指针自身的内存。而显示地使用shared_ptr构造函数来构造则至少需要两次内存分配。除了会产生额外的开销,还可能会导致内存泄漏。在下面这个例子中,如果seed()抛出一个错误就会产生内存泄漏。
void foo(std::shared_ptr<int> p, int init){*p = init;}foo(std::shared_ptr<int>(new int(42)), seed());如果使用make_shared就不会有这个问题了。第三个例子展示了weak_ptr。注意,你必须调用lock()来获得被引用对象的shared_ptr,通过它才能访问这个对象。
auto p = std::make_shared<int>(42);std::weak_ptr<int> wp = p; {auto sp = wp.lock();std::cout << *sp << std::endl;} p.reset(); if(wp.expired())std::cout << "expired" << std::endl;如果你试图锁定(lock)一个过期(指被弱引用对象已经被释放)的weak_ptr,那你将获得一个空的shared_ptr.
0 0
- C++11特性 - Smart Pointers 智能指针
- Smart Pointers智能指针
- 智能指针(Smart Pointers)
- Smart Pointers 智能指针(一)
- Smart Pointers - What, Why, Which? 智能指针
- C++:智能指针(Smart Pointer)
- 【C++】智能指针(Smart Pointer)
- Smart pointers to boost your code(智能指针)
- [翻译] Effective C++, 3rd Edition, Item 17: 在 standalone statements(独立语句)中将 new 出来的 objects(对象)存入 smart pointers(智能指针)
- Smart Pointer--智能指针
- 智能指针(smart pointer)
- 智能指针(smart pointer)
- 智能指针(Smart Pointer)
- 智能指针 smart pointer
- 智能指针五大黄金法则(Five Golden rules of smart pointers)
- (转)智能指针的另外一种实现 - Smart pointers in Delphi
- Boost.Interprocess使用手册翻译之十一:所有权的智能指针(Ownership smart pointers)
- 【more effective c++读书笔记】【第5章】技术(4)——Smart Pointers(智能指针)
- docker容器网络模式配置场景
- 距某某日期倒计时
- 8.11.1 Internal Locking Methods
- 利用Quartz2D,将一张图片画到一个特殊形状的背景图片上
- android中setText不能传int值
- C++11特性 - Smart Pointers 智能指针
- 贪婪模式与懒惰模式(正则表达式)
- 老生常谈session,cookie的区别,安全性
- Spark问题笔记4
- hive几种数据导入方式
- Android动画之translate(位移动画)
- android开发工具
- 解决everything只能搜索C盘的问题
- Uva 1407 Caves(树形dp)