C 中的显式析构函数调用
在 C 中,通常不鼓励显式析构函数调用。但是,在某些特定情况下是允许的。
显式析构函数调用和类模板专业化
如 C 11 标准第 13.4.5 节中所述,显式析构函数调用对于类模板的对象,特化允许显式指定模板参数。这在提供的示例中进行了演示:
<code class="cpp">template<class T> struct A { ~A(); }; void f(A<int>* p, A<int>* q) { p->A<int>::~A(); // OK: destructor call q->A<int>::~A<int>(); // OK: destructor call }</code>
在此实例中,每个显式析构函数调用都针对特定的类模板专业化并执行相应的析构函数。这是允许的,因为析构函数是类模板接口的一部分。
显式析构函数调用的其他情况
除了放置删除的上下文之外,还有有限的用例用于显式析构函数调用。一种值得注意的情况是普通析构函数对象(其析构函数不执行任何操作的对象)的销毁。然而,执行此操作通常没有实际目的。
显式析构函数调用的原因
在放置新的情况下,需要显式析构函数调用才能正确销毁以这种方式创建的对象。
何时不显式调用析构函数
对于局部变量应避免显式调用析构函数。正如 C 常见问题解答中所解释的,在局部变量上显式调用析构函数可能会导致未定义的行为。
结论
虽然通常不建议显式调用析构函数,但它在某些上下文中是允许的,例如类模板专业化和放置新对象的销毁。但是,显式析构函数调用应谨慎使用,并且主要与高级 C 编程场景相关。
以上是C 中何时允许显式析构函数调用?的详细内容。更多信息请关注PHP中文网其他相关文章!