C++基础之boost库的智能指针

【Boost介绍】

Boost是个组织(http://www.boost.org/),提供可移植的,源码开放的C++程序库。部分Boost库已经被包含到了C++标准化委员会的TR1中。

目前可以下载到到最新boost库是1.47.0。解压后的目录结构:

C++基础之boost库的智能指针_第1张图片

使用大多数boost库不需要build,包含头文件就可以了。project 右键Properties -> C/C++ ->General ->Additional Include Directories,填入boost的根目录。(或者还需要C/C++ -> Precompiled Headers -> 选择 Not Using Precompiled Headers.)

对于那些需要build的库,比如IOStreams, Regex等(详细参考文档),如果使用的IDE是Visual Studio的话,可以从Boostpro Computing(http://www.boostpro.com/download/)下载installer安装,目前的最新版本是BoostPro 1.47.0 Installer 。

 

【Boost库的智能指针】

boost 库定义在namespace boost 中。

1. boost::scoped_ptr <boost/scoped_ptr.hpp>

跟std::auto_ptr一样用来管理单个堆内存对象,但是独享所有权,且不允许赋值和拷贝(没有重载operator=)。但是很多情况下我们都需要复制智能指针,scoped_ptr 就满足不了了。

2. boost::shared_ptr <boost/shared_ptr.hpp>

shared_ptr 是基于引用计数的智能指针,可以共享所有权,原理可参见C++基础之创建自己的智能指针。

use_count():返回引用计数值。

#include <boost\shared_ptr.hpp>
#include <iostream>

class Simple
{
public:
	Simple(int param = 0)
	{
		m_number = param;
		std::cout << "Simple: " << m_number << std::endl;
	}

	~Simple()
	{
		std::cout << "~Simple: " << m_number << std::endl;
	}

	void Print()
	{
		std::cout << "Print: " << m_info.c_str() << std::endl;
	}

	std::string m_info;

private:
	int m_number;
};

void Test(boost::shared_ptr<Simple> simple)
{
	simple->Print();
	std::cout << "In Test(), UseCount: " << simple.use_count() << std::endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
	boost::shared_ptr<Simple> mySimple(new Simple(1));
	if (mySimple.get()) //访问裸指针。由于智能指针是一个对象,所以if(smart_object)永远为真。
	{
		mySimple->Print();
		mySimple.get()->m_info = "Hello ";
		mySimple->Print();
		(*mySimple).m_info += "World";
		mySimple->Print();
	}

	std::cout << "1. UseCount: " << mySimple.use_count() << std::endl;
	Test(mySimple);
	std::cout << "2. UseCount: " << mySimple.use_count() << std::endl;

	return 0;
}

执行结果:

C++基础之boost库的智能指针_第2张图片

在Test()函数内部,引用计数为2。

3. boost::scoped_array <boost/scoped_array.hpp>

用于管理动态数组,跟scoped_ptr一样,也是独享所有权。

 4. boost::shared_array <boost/shared_array.hpp>

用于管理动态数组,跟boost::shared_ptr一样,内部使用了引用计数。建议使用std::vector<shared_ptr>,而不是shared_array。

 5. boost::weak_ptr <boost/weak_ptr.hpp>

boost::weak_ptr 是 boost::shared_ptr 的观察者,只对后者进行引用而不改变引用计数,当被观察的boost::shared_ptr失效后,相应的boost::weak_ptr 也失效。boost::weak_ptr 主要用在软件架构设计中,可以在基类中定义一个 boost::weak_ptr,指向子类的 boost::shared_ptr,这样基类通过观察自己的 boost::weak_ptr 是否为空就知道子类有没对自己赋值了,不会影响子类 boost::shared_ptr 的引用计数,用以降低复杂度,更好的管理对象。boost::weak_ptr 也用来解决boost::shared_ptr的循环引用问题。

#include <boost\shared_ptr.hpp> #include <boost\weak_ptr.hpp> #include <iostream>

boost::weak_ptr<Simple> weakSimple; boost::shared_ptr<Simple> mySimple(new Simple(1)); std::cout << "boost::shared_ptr UseCount: " << mySimple.use_count() << std::endl; weakSimple = mySimple; std::cout << "boost::shared_ptr UseCount: " << mySimple.use_count() << std::endl;

尽管做了赋值,但是内部的引用计数没有变化。

6. boost::intrusive_ptr <boost/intrusive_ptr.hpp>

插入式智能指针,内部不含有引用计数,需要程序员自己加入,不然编译不过。

 

【参考】

http://club.topsage.com/thread-2276515-1-1.html

http://blog.csdn.net/xt_xiaotian/article/details/5714477

你可能感兴趣的:(C++,properties,架构设计,regex,Build,installer)