Chinaunix首页 | 论坛 | 博客
  • 博客访问: 310124
  • 博文数量: 94
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 202
  • 用 户 组: 普通用户
  • 注册时间: 2014-08-08 20:07
文章分类

全部博文(94)

文章存档

2017年(19)

2016年(30)

2015年(12)

2014年(33)

我的朋友

分类: LINUX

2017-05-18 19:02:35


点击(此处)折叠或打开

  1. class Customer {
  2. public:
  3.     //...
  4.     Customer(const Customer& rhs);
  5.     Customer& operator=(const Customer& rhs);
  6.     //...

  7. private:
  8.     std::string name;
  9. };

  10. Customer* createCustomer();

  11. void f()
  12. {
  13.     Customer *pCst = createCustomer();
  14.     //...

  15.     delete pCst;
  16. }

在应用编程的时候很容易犯错的一个错误就是资源的释放,如delete pCst很可能在delete之前该函数就被返回了,导致pCst不被正常释放。

不管什么原因,依赖编程者去释放资源总是存在不可靠性。所以,这里引进以对象来管理其使用的资源,即对象被销毁的时候自动释放其使用的资源。


第一种是auto_ptr(类指针对象),其析构函数自动对其所指对象调用delete。


点击(此处)折叠或打开

  1. void f()
  2. {
  3.     std::auto_ptr<Customer> pCst(createCustomer());
  4.     //...
  5. }


以上代码示例展现了2个关键想法:

    1. 获得资源后立刻放入管理对象内;

    2. 管理对象应用析构函数确保资源被释放。

为避免一个对象被多个智能指针auto_ptr管理从而导致被重复释放的可能,auto_ptr有一个特性,在通过copy构造或者copy assignment被复制后,其本体会变成NULL,而复制所得的指针将获得该资源的唯一所有权。


点击(此处)折叠或打开

  1. std::auto_ptr<Customer> pCst1(createCustomer()); //pCst1 owned obj
  2. std::auto_ptr<Customer> pCst2(pCst1); //pCst1 NULL, pCst2 owned obj
  3. pCst1 = pCst2; //pCst2 NULL, pCst1 owned obj


auto_ptr上的复制行为不正常。为了实现正常的复制行为,提出了另一种替代方案---引用计数型智慧指针RCSP。例如TR1的tr1::shared_ptr。

类似文件系统中文件inode的管理,inode描述了一个文件,只有当inode的引用计数为0时,对应的文件才被删除。


点击(此处)折叠或打开

  1. void f()
  2. {
  3.     //...
  4.     std::tr1::shared_ptr<Customer> pCst1(createCustomer()); // pCst1 owned obj
  5.     std::tr1::shared_ptr<Customer> pCst2(pCst1); // pCst2, pCst1 owned obj
  6.     pCst1 = pCst2; // pCst2, pCst1 owned obj
  7.     //...
  8. }


shared_ptr能正常处理copy问题,弥补了auto_ptr的问题。


但是有一点需要注意,不管是auto_ptr还是shared_ptr,其析构函数调用的是delete而不是delete []。

也就是说,他们同样不能安全地处理数组对象的资源释放。

点击(此处)折叠或打开

  1. std::auto_ptr<std::string> asp(new std::string[10]); //misuse of delete
  2. std::tr1::shared_ptr<int> spi(new int[1024]); //misuse of delete




阅读(1945) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~