【问题标题】:Check for Complete type检查完整类型
【发布时间】:2017-11-23 07:15:22
【问题描述】:

我在boost/checked_delete.hpp看到了这段代码

有人能解释一下第 1 行和第 2 行在做什么吗?

template<class T> inline void checked_array_delete(T * x)
{
    typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];     #1 
    (void) sizeof(type_must_be_complete);                       #2
    delete [] x;
}

page,我得到了关于他们目的的信息,

T must be a complete type. The expression delete [] p must be well-formed.

但是,C++ 中的完整类型是什么?

【问题讨论】:

  • #2 不是未使用的本地类型的静默警告。

标签: c++ templates boost


【解决方案1】:

要回答这个问题,需要回答什么是不完整类型。该标准实际上有一个定义([basic.types]/5):

已声明但未定义的类,枚举类型 某些上下文([dcl.enum]),或未知边界的数组或 不完整的元素类型,是一个不完整定义的对象类型。 未完全定义的对象类型和 cv void 是不完全类型 ([基本.基础])。对象不应被定义为具有 类型不完整。

“某些上下文”是指还没有完整定义类型的情况。例如,枚举 enum foo : int; 的前向声明声明了一个不完整的类型。

现在,由于 sizeof 可能不适用于不完整类型 ([expr.sizeof]/1):

sizeof 运算符不应应用于具有 函数或不完整类型,这些类型的括号名称, 或指定位域的泛左值。

对于标准在第一个引用段落中列出的任何类型,typedef 的格式不正确。您会收到一条错误消息,其中包含文本 type_must_be_complete

为了以防万一有pathological compiler extension that allows a type to have 0 size,作者很谨慎,并通过给它一个负大小来确保数组定义仍然是错误的。所以在那些病态的情况下你也不会打电话给delete[]

【讨论】:

  • 酷。但是没有 if-else 子句或 return 语句,那么我们如何避免函数末尾的delete []
  • @SauravSahu - 由于不完整的类型会使上述格式不正确,因此代码将无法编译。它不会在运行时静默泄漏内存。
猜你喜欢
  • 2014-02-02
  • 2021-08-29
  • 2013-12-17
  • 1970-01-01
  • 2011-07-13
  • 1970-01-01
  • 2016-10-06
  • 1970-01-01
相关资源
最近更新 更多