当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《内置类型的析构函数(int,char等..)》经验,为你挑选了1个好方法。

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

void destruct1 (int * item)
{
  item->~int();
}

这段代码几乎相同,我只是将int解压缩到另一种类型,并发生了一些神奇的事情:

typedef int myint;

void destruct2 (myint * item)
{
  item->~myint();
}

为什么第二个代码有效?int是否因为已被typedefed而获得析构函数?

如果你想知道为什么一个人想要这样做:这来自重构C++代码.我们正在删除标准堆并将其替换为自制池.这要求我们调用placement-new和析构函数.我知道调用原始类型的析构函数是没用的,但是我们在代码中想要它们,以防我们后来用实际类替换POD.

发现赤裸裸的int不起作用但是类型合适的东西确实令人惊讶.

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



1> Johannes Sch..:

这是使您的代码适用于通用参数的原因.考虑一个容器C:

template
struct C {
    // ...
    ~C() {
        for(size_t i = 0; i

引入内置类型的特殊情况会很烦人.所以C++允许你做上面的事情,即使T碰巧等于int.神圣的标准说12.4 p15:

显式调用析构函数的表示法可用于任何标量类型名称.允许这样就可以编写代码而无需知道给定类型是否存在析构函数.

使用plain int和typedef'ed int之间的区别在于它们在语法上是不同的东西.规则是,在析构函数调用中,后面的东西~是类型名称.int不是这样的东西,而是一个typedef-name.仔细查看7.1.5.2.

推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有