内置类型的析构函数(int、char 等)

Posted

技术标签:

【中文标题】内置类型的析构函数(int、char 等)【英文标题】:Destructors of builtin types (int, char etc..) 【发布时间】:2010-10-02 03:53:09 【问题描述】:

在 C++ 中,以下代码给出编译器错误:

void destruct1 (int * item)

  item->~int();

这段代码几乎相同,我只是将 int 类型定义为另一种类型,然后神奇的事情发生了:

typedef int myint;

void destruct2 (myint * item)

  item->~myint();

为什么第二个代码有效?一个 int 是否仅仅因为它已被类型定义而得到一个析构函数?

如果您想知道为什么有人愿意这样做:这来自重构 C++ 代码。我们正在删除标准堆并用自制池替换它。这需要我们调用placement-new 和析构函数。我知道为原始类型调用析构函数是没有用的,但我们仍然希望在代码中使用它们,以防我们以后用真正的类替换 POD。

发现裸 int 不起作用但 typedefed 起作用,真是令人惊讶。

顺便说一句 - 我有一个涉及模板功能的解决方案。我们只是在模板中输入定义,一切都很好。

【问题讨论】:

***.com/a/24000744/11862989 也检查一下这个 【参考方案1】:

这就是使您的代码适用于泛型参数的原因。考虑一个容器 C:

template<typename T>
struct C 
    // ...
    ~C() 
        for(size_t i = 0; i<elements; i++)
            buffer[i].~T();
    
;

为内置类型引入特殊情况会很烦人。因此 C++ 允许您执行上述操作,即使 T 恰好等于 int。神圣的标准在12.4 p15 中说:

显式调用析构函数的符号可用于任何标量类型名称。允许这样做可以编写代码,而不必知道给定类型是否存在析构函数。

使用普通 int 和 typedef'ed int 的区别在于它们在语法上是不同的东西。规则是,在析构函数调用中,~ 之后的东西是类型名称。 int 不是这样的东西,但是 typedef-name 是。在7.1.5.2 中查找。

【讨论】:

我认为这就是 std::is_destructible 在旧编译器(2012-2014)中如此不一致的原因 这是关于int 不是类型名称的最后一句话的链接:[dcl.type.simple]。 @JohannesSchaub-litb item-&gt;~myint(); 这行究竟做了什么,或者它相当于; 空白语句?

以上是关于内置类型的析构函数(int、char 等)的主要内容,如果未能解决你的问题,请参考以下文章

析构函数小结

如果使用向量删除叠瓦式自己容器的析构函数中的 char* 成员,则崩溃

gcov 报告的析构函数中的分支是啥?

子类的构造函数,子类的析构函数,子类型关系

c++与java 的析构函数

静态对象成员会在所属类的析构函数被调用时自动析构吗?