- UID
- 2
- 精华
- 积分
- 7736
- 威望
- 点
- 宅币
- 个
- 贡献
- 次
- 宅之契约
- 份
- 最后登录
- 1970-1-1
- 在线时间
- 小时
|
本帖最后由 元始天尊 于 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=。句柄也是可能未被释放的资源,虽然程序退出后,系统会自动释放,不过效果并不好,程序员犯的错自然应该从代码中修复。这里我相应地提出“智能句柄”,意为自动释放句柄。句柄和指针类似,有时甚至一一对应,因此有很多相通之处。下面是设计的简单智能句柄类:
- #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); |
|