C++ 中的原始类型有析构函数吗?

Do Primitive Types in C++ have destructors?

这个问题来自于我试图理解智能指针的动机,您在智能指针周围创建一个包装器 class 以便您可以添加自定义析构函数。指针(以及整数、布尔值、双精度值等)没有析构函数吗?

原始类型(及其复合)有平凡的析构函数。它们什么都不做,并且有特殊的措辞,在某些情况下可以完全跳过它们。

然而,这与 C++ 具有智能指针的原因正交。原始指针是非拥有的:它指向另一个对象,但不影响其生命周期。另一方面,智能指针拥有(或共享)它们的指针对象,将其生命周期与它们自己的生命周期联系起来。这是在内部实现的,以及其他特殊函数,它们的析构函数。

不,指针没有析构函数。通过普通旧指针引用的对象必须是 deleted 以避免内存泄漏,然后调用对象的析构函数,但编译器不会自动调用 delete,即使指针消失范围 - 如果你的程序的另一部分也有一个指向同一个对象的指针怎么办?

智能指针与调用自定义析构函数无关,它们与确保在超出范围时自动清理事物有关。此 'cleaning up' 可能正在删除拥有的对象、freeing 任何 malloced 内存、关闭文件、释放锁等。

析构函数用于释放对象可能使用的资源。

对于指针,如果不从堆中分配新内存,则不需要 delete。

C 和 C++ 有两种存储变量的方法:堆栈和堆。

堆栈用于静态内存,由编译器负责。堆是给动态内存用的,要用到就得注意了。

当您进行原始类型声明时,会为变量分配堆栈内存。

当你使用new声明一个对象时,这个对象是存放在堆上的,当你用完它时需要删除它,否则会造成内存泄漏。

基本上,如果你有新东西,你只需要 delete

从技术上讲,非 class 类型(C++ 术语,通俗地说通常称为 'primitive type')没有析构函数。

C++ 标准仅在 classes 的上下文中提及真正的析构函数,参见 C++ 标准中的 [class.dtor]。除此之外,C++ 还允许使用相同的表示法在非 class 对象上调用析构函数,即以下代码有效:

void foo(int z) {
    using T = int;
    z.~T();
}

这称为 'pseudo-destructor' 并且专门用于允许编写通用模板代码以相同的方式处理 class 和非 class 类型。这个电话什么都不做。此语法在 C++ 标准的 [expr.prim.id] 中定义。