C++ 智能指针的使用

 测试环境:win7, vs2012

 如果未安装boost,请参考:http://blog.csdn.net/alex_my/article/details/17630685

 涉及智能指针:shared_ptr, weak_ptr, scoped_ptr, auto_ptr

 其它:enable_shared_from_this

 总调用函数: testSmartPointer()

 可以将其放在main()中运行。解释在代码中。

#include <string>
#include <vector>
#include <iostream>
#include <boost/scoped_ptr.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/weak_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>

class Base
{
public:
	explicit Base(int a)
	: m_a(a)
	{
	}
	virtual ~Base()
	{
	}

	int GetA() const
	{
		return m_a;
	}

private:
	int m_a;
};

class Derive : public Base
{
public:
	explicit Derive(int b)
		: Base(2 * b)
		, m_b(b)
	{

	}

	virtual ~Derive()
	{
	}

	int GetB() const
	{
		return m_b;
	}

private:
	int m_b;
};

class EnableShared
{
public:
	EnableShared()
	: m_e(3)
	{

	}
	~EnableShared()
	{
		std::cout<< "EnableShared Destruction execute" << std::endl;
	}

	void ShowE()
	{
		boost::shared_ptr<EnableShared> p1(this);
		std::cout<< p1->m_e << std::endl;
	}

private:
	int m_e;
};

class EnableSharedEx : public boost::enable_shared_from_this<EnableSharedEx>
{
public:
	EnableSharedEx()
		: m_e(3)
	{

	}
	~EnableSharedEx()
	{
		std::cout<< "EnableSharedEx Destruction execute" << std::endl;
	}

	void ShowE()
	{
		//boost::shared_ptr<EnableSharedEx> p1(this);
		boost::shared_ptr<EnableSharedEx> p1 = shared_from_this();
		std::cout<< p1->m_e << std::endl;
	}

private:
	int m_e;
};

static void testSharedPtr();
static void testEnableSharedFromthis();
static void testScopedPtr();
static void testAutoPtr();

void testSmartPointer()
{
	// ------------- shared_ptr -------------
	testSharedPtr();

	// ------------- enable_shared_from_this -------------
	testEnableSharedFromthis();

	// ------------- scoped_ptr -------------
	testScopedPtr();

	// ------------- auto_ptr -------------
	testAutoPtr();

	// ------------- summary -------------
	// 1 auto_ptr会转移所有权,使原拥有者失效
	// 2 shared_ptr比起auto_ptr,不会转移所有权,而是增加引用计数
	// 3 scoped_ptr不允许复制
	// 4 weak_ptr起了类似于观察者的作用,不会对拥有者造成影响
}

void testSharedPtr()
{
	// 1 使用
	boost::shared_ptr<Base> pa(new Base(2));
	std::cout<< "testSharedPtr" << pa->GetA() << std::endl;

	// 2 发生引用,此时pa2和pa指向同一个指针,观察计数器share_ptr::use_count_ 值从1变为2。
	boost::shared_ptr<Base> pa2 = pa;

	// 3 弱引用,计数器并仍然是2,不过weak_count_ 从1变成了2。
	boost::weak_ptr<Base> p3 = pa;
}

void testEnableSharedFromthis()
{
	// 1 应用举例
	boost::shared_ptr<EnableShared> pe(new EnableShared);
	//pe->ShowE();

	// 2 注释说明
	// 编译可以通过,但是析构函数会执行两次,造成程序崩溃
	// shared_ptr的一个缺点,无法从this指针构造,无法像testSharedPtr中的引用例子一样。

	// 3 解决办法 enable_shared_from_this,改写EnableShared为EnableSharedEx
	boost::shared_ptr<EnableSharedEx> pex(new EnableSharedEx);
	pex->ShowE();
}

void testScopedPtr()
{
	// 1 应用举例、
	boost::scoped_ptr<Base> pb(new Base(2));
	std::cout << "testScopedPtr" << pb->GetA() << std::endl;

	// 2 引用,无法通过编译,原因:scope_ptr不允许复制
	// boost::scoped_ptr<Base> pb2 = pb;
}

void testAutoPtr()
{
	// 1 应用举例,与shared_ptr相似
	std::auto_ptr<Base> pa(new Base(2));
	std::cout<< "testAutoPtr: " << pa->GetA() << std::endl;

	// 2 发生引用,与shared_ptr不同的地方在于pa编程空指针了。
	std::auto_ptr<Base> pax = pa;
}

不懂它的时候,你觉的它是洪水猛兽。了解它的时候,会觉得它是那么的亲切。

时间: 2024-09-20 06:23:20

C++ 智能指针的使用的相关文章

C++中智能指针(smarter pointer)自定义删除器(deleter) 的方法

智能指针包含两种"shared_ptr"和"unique_ptr", 由于两种指针的实现方式不同, 所以传递删除器的方式也不同; "shared_ptr"的传递删除器(deleter)方式比较简单, 只需要在参数中添加具体的删除器函数名, 即可; 注意是单参数函数; "unique_ptr"的删除器是函数模板(function template), 所以需要在模板类型传递删除器的类型(即函数指针(function pointe

C++引用计数的智能指针有效回收方法

引用计数指针是否能有效地回收,对系统意外关机之后数据的恢复来说至关重要,关键是要避免对象复制. 怎样从灾难性故障中,恢复一个长期运行.系统级的后台守护进程或者服务,在如今的软件设计过程中,已成为了一个重要的考虑因素.当这些软件是由C++语言编成,并使用了引用计数的智能指针时,那么,智能指针的有效回收,对系统是否具有可伸缩级的恢复能力.甚至正确地继续未完成的操作来说,都显得至关重要. 在本文中,描述了一种方法,可从关机之后的软件恢复中,有效地回收引用计数指针,而且此方法在内存占用方面也非常高效,这

在Word 2007中使用智能指针功能

智能指针是Word中的一项编程功能,用户可以在Word2007中启用或取消智能指针功能,操作步骤如下所述: 第1步, 打开Word2007文档窗口,依次单击"Office按钮"→"Word选项"按钮,如图2012040307所示. 图2012040307 单击 "Word选项"按钮 第2步,打开"Word选项"对话框,切换到"高级"选项卡.在"编辑选项"区域选中或取消"使用智

Google C++编程风格指南(四):智能指针和其他C++特性

1.对于智能指针,安全第一.方便第二,尽可能局部化(scoped_ptr): 2.引用形参加上const,否则使用指针形参:3.函数重载的使用要清晰.易读:4.鉴于容易误用,禁止使用缺省函数参数(值得商榷):5.禁止使用变长数组:6.合理使用友元-- Google特有的风情 Google有很多自己实现的使C++代码更加健壮的技巧.功能,以及有异于别处的C++的使用方式. 1.智能指针(Smart Pointers) 如果确实需要使用智能指针的话,scoped_ptr完全可以胜任.在非常特殊的情况

Word 2010中智能指针功能的使用方法

智能指针是Word中的一项编程功能,用户可以在Word 2010中启用或取消智能 指针功能,操作步骤如下: 第1步,打开Word 2010文档窗口,依次单击"文件 "→"选项"命令,如图2011122801所示. 图 2011122801 选择"选项"命令 第2步,打开"Word选项"对话框,切换到"高级"选 项卡.在"编辑选项"区域选中或取消"使用智能指针" 复选框

More Effective C++之智能指针

智能指针具有非常强大的能力,谨慎而明智的选择能带来极大的好处.我不否认智能指针的能力,虽然我在之前的否认过auto_ptr.可能由于我自身能力的限制,体会不到auto_ptr的好处,但这样的可能性我觉得已经不大了.但auto_ptr是最简单的智能指针,在它的周围存在大量的作品,这些作品包括Boost.Loki.ACE等等,但是可惜的是目前没有一个我能够说我很熟悉,那么本篇只是作为一个入门,在此基础上,应当阅读Boost.Loki.ACE相关源码. Smart Pointer的核心是实现 temp

在VC中使用智能指针操作Excel

最近的一个工程中,需要将数据导入Excel表格中,项目经理知道我以前没有接触过操作Excel的经验,于是给了一段小程序给我,让我参考着做. 这段程序是使用智能指针操作Excel,在网络上找了一个星期,居然没有一片关于智能指针操作Excel的文章,只有Automation技术,而且所有介绍Automation技术的文章都是大同小异,并且代码多,说明少.没有任何帮助,光有一堆代码,对于理解和使用没有太大的帮助.在这样一个艰苦的条件下,我决定利用手中仅有的工具:Microsoft Excel Visu

C++ 智能指针深入解析

以下是对C++中智能指针的使用进行了详细的分析介绍,需要的朋友可以参考下   1. 为什么需要智能指针?简单的说,智能指针是为了实现类似于Java中的垃圾回收机制.Java的 垃圾回收机制使程序员从繁杂的内存管理任务中彻底的解脱出来,在申请使用一块内存区域之后,无需去关注应该何时何地释放内存,Java将会自动帮助回收. 但是出于效率和其他原因(可能C++设计者不屑于这种傻瓜氏的编程方式),C++本身并没有这样的功能,其繁杂且易出错的内存管理也一直为广大程序员所诟 病. 更进一步地说,智能指针的出

C++裸指针和智能指针的效率对比

  1.unique_ptr与queue连用,unique_ptr的使用特点:不能使用拷贝构造函数,拷贝赋值函数,但是可以使用move构造函数和move赋值函数. 2.std::move的使用,可以将左值表达式强制转化成为右值表达式 3. 重载new操作符调试内存使用情况,因为心里不是很放心(智能指针真的为我释放了内存么?)所以尝试了重写new delete操作符. 4. 得到的结果是raw_ptr:unique_ptr:shared_ptr的性能是5:7:11,可见智能指针的效率还是相当诱人.

Word2013中怎样使用智能指针

  第1步,打开Word2013文档窗口,依次单击"文件"→"选项"命令,如图2013042403所示. 2第2步,打开"Word选项"对话框,切换到"高级"选项卡.在"编辑选项"区域选中或取消"使用智能指针"复选框,并单击"确定"按钮,如图2013042404所示.