找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 2524|回复: 2

论智能句柄

[复制链接]

307

主题

228

回帖

7345

积分

用户组: 真·技术宅

UID
2
精华
76
威望
291 点
宅币
5595 个
贡献
253 次
宅之契约
0 份
在线时间
949 小时
注册时间
2014-1-25
发表于 2014-12-24 23:03:15 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
本帖最后由 元始天尊 于 2014-12-24 23:07 编辑

    该话题是一个开放性问题,欢迎大家踊跃发表自己的意见,我以下的判断或设计可能出错!
该题目很神奇,大家都熟悉智能指针,什么是智能指针?为什么有智能指针?
    指针是指向某类型数据的地址,由于普通变量——栈变量容量有限,不适合分配大空间,生命期仅在函数作用域内,分配空间直到函数退出才释放,操作起来十分受限,因此C++提供动态分配内存,例如malloc和new,同时提供释放内存函数,用于释放分配的动态内存,如free和delete。堆内存一般较大,对空间的利用率高且可以灵活分配生命周期——从分配时开始,到释放时终止。利用动态内存可以做一些原先栈内存不好做的事,构造复杂数据结构,自动控制内容和长度,例如链表、动态数组、树、图等,不过频繁分配内存也不是很高效的行为,所以要动静结合。
    那么为什么有智能指针呢?C++提供了分配释放动态空间的灵活性,而如果分配了内存未能及时释放的话,会造成内存泄露,对系统和其他程序造成不良影响,更有甚者造成泄密就不好了,因此有人研究了智能指针利用C++语法智能释放动态空间。这里“未能及时释放”不是因为编程者是菜鸟,而是因为在程序工程代码较为庞大,流程较为复杂时,可能释放并不是想象的那么容易(用C做过大程序的会深有体会!!!),可能在某处new,而后N多地方释放,而漏看一处就造成内存泄露。内存泄漏的检测并不是一件直接可以做的事,往往曲折复杂。因此最好的防止性措施就是不产生此类错误。而智能指针可以利用类的生命周期控制动态内存的生命周期,析构时自动释放内存。目前常用的智能指针有auto_ptr shared_ptr unique_ptr,其中auto_ptr已淘汰,shared_ptr基于引用计数。
   
    相对而言,我提出过“句柄泄露”这种东西,详见:http://www.0xaa55.com/forum.php? ... ;tid=695&extra=。句柄也是可能未被释放的资源,虽然程序退出后,系统会自动释放,不过效果并不好,程序员犯的错自然应该从代码中修复。这里我相应地提出“智能句柄”,意为自动释放句柄。句柄和指针类似,有时甚至一一对应,因此有很多相通之处。下面是设计的简单智能句柄类:
  1. #include <windows.h>

  2. template<class T>//T extends HANDLE
  3. class auto_handler
  4. {
  5. public:
  6.         explicit auto_handler(T __hand):_hand(__hand)
  7.         {
  8.                 if(__hand  == NULL || __hand == INVALID_HANDLE_VALUE)
  9.                         throw "INVALID_HANDLE";
  10.         }

  11.         ~auto_handler()//禁止类外使用CloseHandle
  12.         {
  13.                 CloseHandle(_hand);
  14.         };

  15.         operator T()//可使该类作为HANDLE类型参数使用
  16.         {
  17.                 return _hand;
  18.         }
  19. private:
  20.         T _hand;
  21. };
复制代码


由于HANDLE类的引用计数系统已经统计,因此自己设计时并不需要重复操作。
使用方式:
        auto_handler<HANDLE> file(CreateFile("1.txt",GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL));
        ReadFile(hand,NULL,0,NULL,NULL);
回复

使用道具 举报

55

主题

275

回帖

9356

积分

用户组: 管理员

UID
77
精华
16
威望
237 点
宅币
8221 个
贡献
251 次
宅之契约
0 份
在线时间
255 小时
注册时间
2014-2-22
发表于 2014-12-25 00:09:10 | 显示全部楼层
我能说我最恨编译器多事么。。。自己申请,自己释放,别人别管。。。
回复 赞! 靠!

使用道具 举报

4

主题

41

回帖

160

积分

用户组: 小·技术宅

UID
208
精华
0
威望
1 点
宅币
113 个
贡献
0 次
宅之契约
0 份
在线时间
10 小时
注册时间
2014-4-16
发表于 2015-2-22 00:12:43 | 显示全部楼层
申请和释放,成对出现,是个好习惯哈~只是代码多了 不方便罢
回复 赞! 靠!

使用道具 举报

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-4-29 10:47 , Processed in 0.033559 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表