C++智能指针shared_array

        这几天写一个程序,经常用到动态分配的指针,然后自己又有强迫症,每次动态分配之后,不delete或者delete[]掉,就不舒服,但是同时自己又有健忘症,有时候写着写着,又忘了delete或者delete[]了,想起来前段时间了解到的智能指针,可以在变量生存周期结束后,自动释放内存,这让我甚是欢喜,何不来试试?但是毕竟是初次使用,所以还是先做了一些程序测试,避免后面出bug。因为主要用到的是动态分配的数组,所以本文主要介绍shared_array。比较详细和总体的介绍,大家可以参考http://blog.csdn.net/xt_xiaotian/article/details/5714477
       首先介绍一下这个智能指针从哪里来,首先,memory头文件在表示智能指针的std命名空间中定义了如下类型(截图来自VC++2012入门经典):
       
        当然,其实仔细看一下,里面还有几种其他类型的智能指针定义,也就不一一说了,这里不是重点。
        上面这些智能指针类型都是定义在std命名空间中的,实际上,除了std之外,有一个类似的,甚至更加强大的模板库boost,这个库需要自己去下载和配置,具体去sourceforge上搜索下载最新版即可(http://sourceforge.net/projects/boost/?source=directory),到我写这个博客的时候,最新版是1.59,我boost_1_59_0.zip,并解压后,直接将boost_1_59_0文件夹下的boost文件夹复制到VS的安装目录的VC\include文件夹下即可,如下图:
       
        然后在使用boost中定义的智能指针时,只要包含头文件#include <boost\smart_ptr.hpp>,再加上using namespace boost就可以使用了。
                  
        上图截自boost库关于Smart Pointers的说明文档(http://www.boost.org/doc/libs/1_59_0/libs/smart_ptr/smart_ptr.htm),也就是定义了六中智能指针,有兴趣的自己去学习下,本文还是只讲一下shared_array了。
        shared_array的类摘要如下:         
namespace boost {
  template<class T> class shared_array {
    public:
      typedef T element_type;
      explicit shared_array(T * p = 0);
      template<class D> shared_array(T * p, D d);
      ~shared_array(); // never throws
      shared_array(shared_array const & r); // never throws
      shared_array & operator=(shared_array const & r); // never throws
      void reset(T * p = 0);
      template<class D> void reset(T * p, D d);
      T & operator[](std::ptrdiff_t i) const; // never throws
      T * get() const; // never throws
      bool unique() const; // never throws
      long use_count() const; // never throws
      operator unspecified-bool-type() const; // never throws
      void swap(shared_array<T> & b); // never throws
  };
  template<class T>
    bool operator==(shared_array<T> const & a, shared_array<T> const & b); // never throws
  template<class T>
    bool operator!=(shared_array<T> const & a, shared_array<T> const & b); // never throws
  template<class T>
    bool operator<(shared_array<T> const & a, shared_array<T> const & b); // never throws
  template<class T> void swap(shared_array<T> & a, shared_array<T> & b); // never throws
}
        好了,下面直接就上测试代码吧,为了简单,我用了int类型的动态数组,当然,也可以换成其他的数据类型或者类,不然这个就太局限了。。
#include <iostream>
#include <boost\smart_ptr.hpp>
using namespace std;
using namespace boost;

int main()
{
	int *int_array = new int[10];// 动态分配一个数组
	for (int i = 0; i < 10; i++) {
		int_array[i] = i + 1;
	}
	shared_array<int> smart_int_array(int_array);// 将数组定义位智能指针

	// 不同的引用数组方式
	cout << "访问方式1:通过原始数组名来访问" << endl;
	for (int i = 0; i < 10; i++) {
		cout << int_array[i] << " ";
	}
	cout << endl;
	cout << "访问方式1:通过智能指针访问" << endl;
	for (int i = 0; i < 10; i++) {
		cout << smart_int_array[i] << " ";
	}	
	cout << endl;

	// 另外一种定义智能指针的方法,也就是先定义,后赋值的方法
	// 测试结果证明也是可行的
	shared_array<int> smart_int_array2;
	// 下面要注意了,在初始化的时候,不能再用int_array作为形参了
	// 也没仔细分析原因,最后程序会出现崩溃,也就是说,同一个数组
	// 只能用一个智能指针来管理吧
	smart_int_array2 = shared_array<int>(new int[10]);

	for (int i = 0; i < 10; i++) {
		smart_int_array2[i] = 11 + i;
	}
	cout << "先定义,再初始化,再赋值的方式" << endl;
	for (int i = 0; i < 10; i++) {
		cout << smart_int_array2[i] << " ";
	}
	cout << endl;

	// // 再有就是最有意思的了 ///
	// 我先定义一个数组
	int *int_array2 = new int[10];// 动态分配一个数组
	for (int i = 0; i < 10; i++) {
		int_array2[i] = i + 21;
	}
	// 下面验证发现输出的值没有问题
	cout << endl << "定义智能指针前数组的值:" << endl;
	for (int i = 0; i < 10; i++) {
		cout << int_array2[i] << " ";
	}
	cout << endl;
	// 我再在一个局部作用域内为该数组指定一个智能指针
	if (true) {
		shared_array<int> smart_int_array3(int_array2);
	}
	// 当出了这个作用域,智能指针被销毁,我们再来看下原始数组变了没
	cout << "智能指针销毁后数组的值:" << endl;
	for (int i = 0; i < 10; i++) {
		cout << int_array2[i] << " ";
	}
	cout << endl;

	return 1;
}
        程序输出结果如下图:
 
        尤其是最后一个部分,我是觉得很神奇的,说明不管你原始数组定义的作用域在哪里,只要在其上定义的智能指针别销毁了,那么,这部分空间也就被销毁了,那么再输出的话,看到的都是一些无效值了,在使用中还是要注意的。
        另外,关于定义方式,还是比较好的,定义时不需要马上初始化和赋值,再加上数组的[]访问操作符仍然存在,最后还不需要我们手动delete[],真是再好不过了。
        还有补充一点,就是这种shared_array是可以用=对其中的元素逐个赋值的,不像scoped_array和scoped_ptr,详细内容,大家查看文档便知,网址文中也有。
        (说的不对的,望指正,谢谢!)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值