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

Jos*_*gal 2 c++ pointers destructor smart-pointers

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

Ser*_*eyA 7

从技术上讲,非类类型(C++ 术语在外行话中通常称为“原始类型”)没有析构函数。

C++ 标准仅在类的上下文中谈到真正的析构函数,请参阅 C++ 标准中的 [class.dtor]。除此之外,C++ 还允许使用相同的符号在非类对象上调用析构函数,即以下代码是有效的:

void foo(int z) {
    using T = int;
    z.~T();
}
Run Code Online (Sandbox Code Playgroud)

这称为“伪析构函数”,专门用于编写通用模板代码,以相同的方式处理类和非类类型。这个调用什么都不做。此语法在 C++ 标准中的 [expr.prim.id] 中定义。


Que*_*tin 5

原始类型(及其复合类型)具有简单的析构函数。这些不做任何事情,并且有特殊的措辞,允许在某些情况下完全跳过它们。

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

  • @Joshua 是的,就是这样。它主要是为了一致性,但被指定为无操作。 (3认同)
  • 对于析构函数来说这是不正确的。请参阅我的答案以获得正确的解释。 (3认同)