boost::scoped_array

1.简介

   scoped_array很像scoped_ptr,它包装了new[ ]操作符(不是单纯的new)在堆上分配的动态数组,为动态数组提供了一个代理,包装可以正确地释放内存。

2. scoped_array 分析

  scoped_array 的类摘要如下所示(这里列出重要部分):
template<class T> class scoped_array // noncopyable
{
private:
 
    T * px;
 
    scoped_array(scoped_array const &);
    scoped_array & operator=(scoped_array const &);
 
    typedef scoped_array<T> this_type;
 
    void operator==( scoped_array const& ) const;
    void operator!=( scoped_array const& ) const;
 
public:
 
    typedef T element_type;
 
    explicit scoped_array( T * p = 0 ) BOOST_SP_NOEXCEPT : px( p )
    {
    }
 
    ~scoped_array() // never throws
    {
        boost::checked_array_delete( px );
    }
 
    void reset(T * p = 0) // never throws (but has a BOOST_ASSERT in it, so not marked with BOOST_NOEXCEPT)
    {
        BOOST_ASSERT( p == 0 || p != px ); // catch self-reset errors
        this_type(p).swap(*this);
    }
 
    T & operator[](std::ptrdiff_t i) const // never throws (but has a BOOST_ASSERT in it, so not marked with BOOST_NOEXCEPT)
    {
        BOOST_ASSERT( px != 0 );
        BOOST_ASSERT( i >= 0 );
        return px[i];
    }
 
    T * get() const BOOST_NOEXCEPT
    {
        return px;
    }
 
// implicit conversion to "bool"
#include <boost/smart_ptr/detail/operator_bool.hpp>
 
    void swap(scoped_array & b) BOOST_NOEXCEPT
    {
        T * tmp = b.px;
        b.px = px;
        px = tmp;
    }
};
从源码上可以看出scoped_array 的接口和功能几乎与scoped_ptr 是相同的,这里我们就不重复说明。需要的可以参考 boost::scoped_ptr智能指针
  scoped_array 主要有如下特点:
  • 构造函数接受的指针p必须是new[ ]的结果,而不能是new表达式的结果;
  • 没有* 、-> 操作符重载,因为scoped_array 持有的不是一个普通指针;
  • 析构函数使用 delete[ ] 释放资源,而不是delete;
  • 提供 operator[ ] 操作符重载,可以像普通数组一样用下标访问元素;
  • 没有 begin()、end() 等类似容器的迭代器操作函数。
  在使用重载的operator[ ]时要小心,scoped_array 不提供数组索引的范围检查,如果使用了超过动态数组大小的索引或者是负数索引将引发未定义行为。

3. 使用示例

/********************************************************************************* 
*Copyright(C),Your Company 
*FileName:  main.cpp 
*Author:  Huangjh 
*Version: 
*Date:  2018-01-30 
*Description:  scoped_array的测试用例
*Others: 
**********************************************************************************/
#include <iostream>
#include <boost/smart_ptr.hpp>
 
using namespace std;
using namespace boost;
 
#define SCOPED_ARRAY_TEST_COUNT	10
 
class CTest
{
public:
	~CTest()
	{
		cout << "CTest 的析构函数" << endl;
	}
 
	void DoSomething(void)
	{
		cout << "do something ..." << endl;
	}
};
 
//离开Function的作用域之后就会释放掉动态分配的数组
void Function(void)
{
	scoped_array<CTest> spArray(new CTest[SCOPED_ARRAY_TEST_COUNT]);
 
	for (int i = 0; i < SCOPED_ARRAY_TEST_COUNT; ++i)
	{
		//scoped_array重载了[]操作符,可以当做数组一样使用
		spArray[i].DoSomething();
	}
}
 
int main(void)
{
	cout << "scoped_array test start ..." << endl;
 
	Function();
 
	cout << "scoped_array test end ..." << endl;
 
	return 0;
}
运行结果如下所示:
scoped_array test start ...
do something ...
do something ...
do something ...
do something ...
do something ...
do something ...
do something ...
do something ...
do something ...
do something ...
CTest 的析构函数
CTest 的析构函数
CTest 的析构函数
CTest 的析构函数
CTest 的析构函数
CTest 的析构函数
CTest 的析构函数
CTest 的析构函数
CTest 的析构函数
CTest 的析构函数
scoped_array test end ...

4. 总结

  scoped_array 没有给程序增加额外的负担,用起来很方便轻巧。它的速度与原始数组通用很快,很适合那些习惯用new操作符在堆上分配内存的程序员。但scoped_array 的功能很有限,不能动态增长,也没有迭代器支持,不能搭配STL算法,仅有一个纯粹的“裸”数组接口。因此,在需要动态数组的情况下我们应该使用std::vector,它比scoped_array提供了更多的灵活性,而只付出了很小的代价。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值