元始天尊 发表于 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?mod=viewthread&tid=695&extra=。句柄也是可能未被释放的资源,虽然程序退出后,系统会自动释放,不过效果并不好,程序员犯的错自然应该从代码中修复。这里我相应地提出“智能句柄”,意为自动释放句柄。句柄和指针类似,有时甚至一一对应,因此有很多相通之处。下面是设计的简单智能句柄类:
#include <windows.h>

template<class T>//T extends HANDLE
class auto_handler
{
public:
        explicit auto_handler(T __hand):_hand(__hand)
        {
                if(__hand== NULL || __hand == INVALID_HANDLE_VALUE)
                        throw "INVALID_HANDLE";
        }

        ~auto_handler()//禁止类外使用CloseHandle
        {
                CloseHandle(_hand);
        };

        operator T()//可使该类作为HANDLE类型参数使用
        {
                return _hand;
        }
private:
        T _hand;
};


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

Golden Blonde 发表于 2014-12-25 00:09:10

我能说我最恨编译器多事么。。。自己申请,自己释放,别人别管。。。:lol

0x0208 发表于 2015-2-22 00:12:43

申请和释放,成对出现,是个好习惯哈~只是代码多了 不方便罢
页: [1]
查看完整版本: 论智能句柄