基本类型析构函数的实际作用及一段特殊C++代码的疑问解析
关于C++基本类型显式调用析构函数的问题
先看你给出的这段C++代码:
typedef int int_t; int val = 55; val.~int_t(); printf("%d\n", val);
以及x86-64 gcc 5.1生成的汇编:
sub rsp, 8 mov esi, 55 mov edi, OFFSET FLAT:.LC0 ;"%d\n" xor eax, eax call printf xor eax, eax add rsp, 8 ret
1. 这段代码为什么合法?
C++标准为了兼容泛型编程(比如让模板能统一处理自定义类型和基本类型),规定基本类型(int、char等)被视为拥有平凡析构函数,语法上允许显式调用它们的析构函数。哪怕用typedef给基本类型起别名(比如这里的int_t),编译器依然能识别出这是基本类型的平凡析构,所以代码符合语法规范,是合法的。
2. 栈上的基本类型是否拥有析构函数?析构函数实际执行什么?
栈上的基本类型确实拥有析构函数,但属于平凡析构函数。这类析构函数本身不执行任何实际操作,编译器会直接优化掉对它的显式调用——这就是你在汇编代码里看不到.~int_t()对应执行指令的原因。
这种设计的核心目的是让模板代码不用区分“有自定义析构的类”和“基本类型”,比如写模板容器时,不需要专门为基本类型做特殊处理,统一调用析构函数即可,编译器会自动优化掉基本类型的空操作析构。
内容的提问来源于stack exchange,提问作者thedemons
相关产品推荐
相关产品推荐

