在参考了一些资料,并且尝试了几次之后,也逐渐想到了一个用来安全释放 IOCP 资源的办法。
[url]http://groups.google.com/group/dev4server/browse_thread/thread/29a91064931a628e[/url]
接着发现有人已经把这种方案描述的很清楚了
[url]http://blog.codingnow.com/2007/07/robust.html#comment-12142[/url]
对大家的讨论不置可否,但是使用ID代替指针确实在某些方面是有益处的。
而某些时候我们无法使用智能指针。举个例子,完成端口中
[code]
GetQueuedCompletionStatus(
*pTHIS,
&dwNumberBytes,
(PULONG_PTR)&lpKey,
&lpEvent,
INFINITE
);
[/code]
其中的lpKey是一个非常关键的变量,我们一般把它置为一个对象的指针。这样我们就可以通过这个指针去访问该对象。
但是事实上很多时候这个指针的生命周期是不固定的,而由于其传入的是PULONG_PTR类型的值,我们又不能直接使用智能指针。要么就要繁琐的执行addref 和 release 这样的操作而完全丢失智能指针的优越性。
可是,如果这里传入的是一个ID或者HANDLE,为其对象的访问增加一层间接性。那么我们就可以预防非法的指针访问,从而达到安全的生命周期管理。
[url]http://groups.google.com/group/dev4server/browse_thread/thread/29a91064931a628e[/url]
接着发现有人已经把这种方案描述的很清楚了
[url]http://blog.codingnow.com/2007/07/robust.html#comment-12142[/url]
对大家的讨论不置可否,但是使用ID代替指针确实在某些方面是有益处的。
而某些时候我们无法使用智能指针。举个例子,完成端口中
[code]
GetQueuedCompletionStatus(
*pTHIS,
&dwNumberBytes,
(PULONG_PTR)&lpKey,
&lpEvent,
INFINITE
);
[/code]
其中的lpKey是一个非常关键的变量,我们一般把它置为一个对象的指针。这样我们就可以通过这个指针去访问该对象。
但是事实上很多时候这个指针的生命周期是不固定的,而由于其传入的是PULONG_PTR类型的值,我们又不能直接使用智能指针。要么就要繁琐的执行addref 和 release 这样的操作而完全丢失智能指针的优越性。
可是,如果这里传入的是一个ID或者HANDLE,为其对象的访问增加一层间接性。那么我们就可以预防非法的指针访问,从而达到安全的生命周期管理。