指针删除为何这样?

future_fighter 2009-03-07 05:05:16

template<class T> inline void checked_delete(T * x)
{
// intentionally complex - simplification causes regressions
typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];
(void) sizeof(type_must_be_complete);
delete x;
}

删除指针前的检查函数,不知道:
typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];
(void) sizeof(type_must_be_complete);

这两句有何用意?sizeof(T)何时能是0? 麻烦各位大虾给个提示!或着举个例子!使得sizeof(T)为0!
在此先行谢过了!
...全文
102 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
future_fighter 2009-03-07
  • 打赏
  • 举报
回复
C++标准说:可以删除(delete)指向非完整类的指针!

编译器一般实现时,delete 非完整类的指针仅给出waring!
此处的checked_delete就是为此设计的!


class test;

test* pt;
delete pt; //oly warning(g++: 'pt' has incomplete type)

test* pt;
checked_delete(pt); // error occurs(g++: error: invalid application of 'sizoef' to incomplete type 'test')


呵呵..目的达成!要的就是它编译时不能通过!警示下我们,test类没有定义,delete是毫无意义的!
这也应该就是该函数的目的了!
jakqigle 2009-03-07
  • 打赏
  • 举报
回复
c++的类sizeof从没有=0的时候。即使在类中没有任何数据成员,也会sizeof(classT)= 1;
future_fighter 2009-03-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 future_fighter 的回复:]
引用 4 楼 xkyx_cn 的回复:
大多数编译器对于sizeof操作数是不完整类型的,会给出error信息,所以你很难写出sizeof为0的代码

但在如stl,boost这类库的代码中,为了保持代码的稳定性,不得不做这样的检查


什么样的类型算是不完整的呢?呵呵...刚入门,有好多不懂!请教下!可否举个例子,谢谢!
[/Quote]

呵呵...明白了,原来只声明,不定义的类型就叫做不完整的(incomplete type),谢过了!
future_fighter 2009-03-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 future_fighter 的回复:]
引用 4 楼 xkyx_cn 的回复:
大多数编译器对于sizeof操作数是不完整类型的,会给出error信息,所以你很难写出sizeof为0的代码

但在如stl,boost这类库的代码中,为了保持代码的稳定性,不得不做这样的检查


什么样的类型算是不完整的呢?呵呵...刚入门,有好多不懂!请教下!可否举个例子,谢谢!
[/Quote]

呵呵...明白了!原来只声明,不定义的类就算作不完整的类型(incomplete type)!呵呵...谢过了!
xkyx_cn 2009-03-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 future_fighter 的回复:]
引用 4 楼 xkyx_cn 的回复:
大多数编译器对于sizeof操作数是不完整类型的,会给出error信息,所以你很难写出sizeof为0的代码

但在如stl,boost这类库的代码中,为了保持代码的稳定性,不得不做这样的检查


什么样的类型算是不完整的呢?呵呵...刚入门,有好多不懂!请教下!可否举个例子,谢谢!
[/Quote]

例如:

// 没有大小的数组
typedef char incomplete_array[];
// 没有定义的类
class incomplete_class;

pengzhixi 2009-03-07
  • 打赏
  • 举报
回复
你要想,如果不含非static数据成员的类如果sizeof为0的话,那定义它的对象就毫无意义了。再者在继承体系当中如果以它为基类的话,sizeof为0也体现不出它在继承体系当中的位置了。
个人愚见
future_fighter 2009-03-07
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xkyx_cn 的回复:]
大多数编译器对于sizeof操作数是不完整类型的,会给出error信息,所以你很难写出sizeof为0的代码

但在如stl,boost这类库的代码中,为了保持代码的稳定性,不得不做这样的检查
[/Quote]

什么样的类型算是不完整的呢?呵呵...刚入门,有好多不懂!请教下!可否举个例子,谢谢!
xkyx_cn 2009-03-07
  • 打赏
  • 举报
回复
大多数编译器对于sizeof操作数是不完整类型的,会给出error信息,所以你很难写出sizeof为0的代码

但在如stl,boost这类库的代码中,为了保持代码的稳定性,不得不做这样的检查
  • 打赏
  • 举报
回复
等高手解释
future_fighter 2009-03-07
  • 打赏
  • 举报
回复
呵呵...的确很奇怪!不知道这个是何用意!
是啊,C++标准规定任何类的sizeof都必须>=1, 一个空类他的sizeof就是1.

估计此处这样写和模板这玩意有啥关系!就是不知道干啥要这样写!奇怪.....
pengzhixi 2009-03-07
  • 打赏
  • 举报
回复
以我目前看来 还没看到sizeof结果为0的类型。即使一个什么数据都不包含的的类的sizeof也不为0

64,641

社区成员

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

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