基于模板的安全delete

wswqwps 2008-07-11 01:25:45
就是经典的SafeDelete问题. 一般好像是用宏写成

//...
#define SafeDelete(P) { delete (p); (p) = 0;}

不知这么写是不是更好:
//...
template< typename T >
void _SafeDelete( T* &p ) { delete p; p = 0; }

而delete 数组这样写:
//...
template< typename T >
void _SafeDeleteArray( T* &p ){ delete [] p; p = 0; }

至少这样写去delete静态分配的数组是无法编过的.但是这样有潜在的问题吗?
...全文
109 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
五号智能 2008-07-12
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wswqwps 的回复:]

多人工程里我觉得是可以带来好处, 调用这个可以强制把指针设置为0,避免部分人的习惯不好或疏忽大意, 该调用delete [] 却只调用delete, 改把指针设置为0而忘记.
使用统一删除可以以行政手段强制约束,但是坏习惯和马虎大意确实不可避免的.

另外我没理解来您的意思, 这样会有泄露否.
[/Quote]

理解你的意思了,确实有好处

删除数组的那个。如果正确使用应该不会泄漏。不过,如果这个数组是指针数组,数组的每个指针也分配了内存。

直接用这个会泄漏。

有点建议:
能不能在这个函数判断一下,处理下一层指针分配问题?

然后再处理一下,下一层的下一层。。。

或行政管理一下,说明这个数组只能删两层元素。。或三层。。



wjb_yd 2008-07-12
  • 打赏
  • 举报
回复
该delete的地方用delete [],行为未定义
wswqwps 2008-07-12
  • 打赏
  • 举报
回复
或行政管理一下,说明这个数组只能删两层元素。。或三层。。
--------------------------------------------------
肯定会写在头文件里加上函数头规范注释的.剩下的就是调用者的责任.
wswqwps 2008-07-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xgywd 的回复:]
理解你的意思了,确实有好处

删除数组的那个。如果正确使用应该不会泄漏。不过,如果这个数组是指针数组,数组的每个指针也分配了内存。

直接用这个会泄漏。

有点建议:
能不能在这个函数判断一下,处理下一层指针分配问题?

然后再处理一下,下一层的下一层。。。

或行政管理一下,说明这个数组只能删两层元素。。或三层。。
[/Quote]

不会泄漏就放心了.

至于您说的第二点,我有点不同的看法.
我认为这个函数模板只是简单的包装一下delete [], 关键的功能是附带着把指针设为0.
delete [] 对于指针的数组也只是删除本身而不会去递归删除其中每个指针吧, 所以我只要保持和 delete [] 行为一致就好了.
如果发生直接调用导致泄漏恐怕不是这个函数的责任.
wswqwps 2008-07-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xgywd 的回复:]
引用 1 楼 wswqwps 的回复:
我想知道p会不会退化成普通指针,如果是的话,对普通指针调用delete[]会怎么样,未定义行为?


你想把这两个重载?

还好不是一个名字,不然的话,就出二义性了,肯定是不行的.

p你传过来的时候就是指针,因为你自己是这样定义的.而且动态数组,就是指针.它和普通数组是不一样的.
你创建的时候,它就是普通指针,无论你给它分配多少内存.

第一个问题:这样做有潜在问题吗?
其实这样做一点必要…
[/Quote]

多人工程里我觉得是可以带来好处, 调用这个可以强制把指针设置为0,避免部分人的习惯不好或疏忽大意, 该调用delete [] 却只调用delete, 改把指针设置为0而忘记.
使用统一删除可以以行政手段强制约束,但是坏习惯和马虎大意确实不可避免的.

另外我没理解来您的意思, 这样会有泄露否.
五号智能 2008-07-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wswqwps 的回复:]
我想知道p会不会退化成普通指针,如果是的话,对普通指针调用delete[]会怎么样,未定义行为?
[/Quote]

你想把这两个重载?

还好不是一个名字,不然的话,就出二义性了,肯定是不行的.

p你传过来的时候就是指针,因为你自己是这样定义的.而且动态数组,就是指针.它和普通数组是不一样的.
你创建的时候,它就是普通指针,无论你给它分配多少内存.

第一个问题:这样做有潜在问题吗?
其实这样做一点必要都没有,直接用delete就删了,还要调用一个函数,只能是浪费时间.你觉得你的函数比直接用方便?
防内存泄漏,不是一个函数可以解决的问题,它是意识,你检查的意识,有了意识才不会错,没有意识你写了函数也不会去把这个函数放在应该用到它的地方.
WingForce 2008-07-11
  • 打赏
  • 举报
回复
我更喜欢用智能指针
wswqwps 2008-07-11
  • 打赏
  • 举报
回复
晕了,没人回答吗???
wswqwps 2008-07-11
  • 打赏
  • 举报
回复
我想知道p会不会退化成普通指针,如果是的话,对普通指针调用delete[]会怎么样,未定义行为?

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧