boost enable_shared_from_this
关于shared_ptr和weak_ptr看以前的:http://www.cnblogs.com/youxin/p/4275289.html
The header <boost/enable_shared_from_this.hpp> defines the class template enable_shared_from_this. It is used as a base class that allows a shared_ptr to the current object to be obtained from within a member function.
class Y: public enable_shared_from_this<Y>
{
public: shared_ptr<Y> f()
{
return shared_from_this();
}
} int main()
{
shared_ptr<Y> p(new Y);
// 调用f获得shared_ptr shared_ptr<Y> q = p->f();
assert(p == q);
assert(!(p < q || q < p)); // p and q must share ownership }
一篇文章:
shared_ptr很好地消除了显式的delete调用,如果读者掌握了它的用法,可以肯定delete将会在你的编程字典中彻底消失 。
但这还不够,因为shared_ptr的构造还需要new调用,这导致了代码中的某种不对称性。虽然shared_ptr很好地包装了new表达式,但过多的显式new操作符也是个问题,它应该使用工厂模式来解决。
因此,shared_ptr在头文件<boost/make_shared.hpp> 中提供了一个自由工厂函数(位于boost名字空间)make_shared<T>(),来消除显式的new调用,它的名字模仿了标准库的 make_pair(),声明如下:
- template<class T, class... Args>
 - shared_ptr<T> make_shared( Args && ... args );
 
make_shared()函数可以接受最多10个参数,然后把它们传递给类型T的构造函数,创建一个shared_ptr<T>的对 象并返回。make_shared()函数要比直接创建shared_ptr对象的方式快且高效,因为它内部仅分配一次内存,消除了shared_ptr 构造时的开销。
下面的代码示范了make_shared()函数的用法:
- #include <boost/make_shared.hpp>
 - int main()
 - {
 - shared_ptr<string> sp =
 - make_shared<string>("make_shared");
//创建string的共享指针 - shared_ptr<vector<int> > spv =
 - make_shared<vector<int> >(10, 2);      
//创建vector的共享指针 - assert(spv->size() == 10);
 - }
 
make_shared()不能接受任意多数量的参数构造对象,一般情况下这不会成为问题。实际上,很少有如此多的参数的函数接口,即使有,那也会是一个设计的不够好的接口,应该被重构。
除了make_shared(),smart_ptr库还提供一个allocate_shared(),它比make_ shared()多接受一个定制的内存分配器类型参数,其他方面都相同。
boost enable_shared_from_this的更多相关文章
- 2016-11-02: boost::enable_shared_from_this
		
使用场景 当类对象被shared_ptr管理时,需要在类自己定义的函数中把当前对象作为参数传递给其他函数时,必须传递一个shared_ptr,否则就不能保持shared_ptr管理这个类对象的语义.因 ...
 - boost库----enable_shared_from_this类的作用和实现原理
		
使用boost库时,经常会看到如下的类 class A:public enable_share_from_this<A> 在什么情况下要使类A继承enable_share_from_thi ...
 - 关于boost中enable_shared_from_this类的原理分析
		
首先要说明的一个问题是:如何安全地将this指针返回给调用者.一般来说,我们不能直接将this指针返回.想象这样的情况,该函数将this指针返回到外部某个变量保存,然后这个对象自身已经析构了,但外部变 ...
 - c++ boost asio库初学习
		
前些日子研究了一个c++的一个socket库,留下范例代码给以后自己参考. 同步server: // asio_server.cpp : コンソール アプリケーションのエントリ ポイントを定義します. ...
 - 如何在多线程leader-follower模式下正确的使用boost::asio。
		
#include <assert.h> #include <signal.h> #include <unistd.h> #include <iostream& ...
 - BOOST.Asio——Tutorial
		
=================================版权声明================================= 版权声明:原创文章 谢绝转载 啥说的,鄙视那些无视版权随 ...
 - boost asio tcp server 拆分
		
从官方给出的示例中对于 boost::asio::ip::tcp::acceptor 类的使用,是直接使用构造函数进行构造对象,这一种方法用来学习是一个不错的方式. 但是要用它来做项目却是不能够满足我 ...
 - boost相关
		
1 boost 常用函数 <1> tcp跟udp的收发函数名 tcp收发 async_write async_read async_read_until udp收发 async_send_ ...
 - boost::asio::socket  tcp 连接  在程序结束时崩溃。
		
刚开始的时候一直不知道怎么回事,不过幸好我有在每个class 的析构时都打印一条信息. 这个时候发现我的一个tcp_connection (就是自定义的一个连接类) 在最后才被析构. 所以感觉这里可能 ...
 
随机推荐
- iOS越狱系统使用root权限运行命令
			
//命令原型:sh -c "echo 密码 | su -c 'ls --help' " //转载请注明:http://www.cnblogs.com/bandy/p/7069503 ...
 - maven 完整的settings.xml
			
maven 完整的settings.xml <?xml version="1.0" encoding="UTF-8"?> <!-- Licen ...
 - jenkins发布docker到mesos
			
1.前提是装好git.SSH.maven插件 2.jenkins新建一个项目,配好git拉取代码.maven编译构建(gradle构建也行,这不重要) 3.SSH Server,填写需要传输的jar文 ...
 - Python Scrapy 自动爬虫注意细节(3)
			
一.对指定页面爬取 yield Request(url, meta={'cookiejar': response.meta['cookiejar']}, callback=self.parse_url ...
 - Android弹出一项权限请求
			
Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(ena ...
 - SensorManager
			
光照传感器 Android 中每个传感器的用法其实都比较类似,真的可以说是一通百通了.首先第一步要获取到 SensorManager 的实例 SensorManager senserManager = ...
 - 如何用sql语句复制一张表
			
如何用sql语句复制一张表 1.复制表结构及数据到新表 CREATE TABLE 新表 SELECT * FROM 旧表 这种方法会将oldtable中所有的内容都拷贝过来,当然我们可以用delete ...
 - nexus的pom配置
			
<groupId>com .sms</groupId><artifactId>sms </artifactId><packaging>pom ...
 - SaltStack之编译安装LNMP环境
			
使用saltstack编译安装LNMP环境 一,系统版本查看 二,安装salt-master和salt-minion 安装配置过程参考SaltStack概述及安装 三,修改配置文件 /etc/salt ...
 - poj3666 Making the grade【线性dp】
			
Making the Grade Time Limit: 1000MS Memory Limit: 65536K Total Submissions:10187 Accepted: 4724 ...