c++ - 显式调用析构函数

xwbar的头像
2025-05-06 23:17:36
/
世界杯克罗地亚

在我看来,在这种情况下我们可以显式调用析构函数,你能解释一下为什么吗?

因为语言允许它可以随时调用任何对象的析构函数(假设您有访问权限,例如它不是私有析构函数)。

在这个例子中,这些析构函数调用是什么意思?

它只是调用析构函数。从逻辑上讲,这意味着该对象已被破坏,从那时起应该被视为垃圾,不应取消引用或使用。从技术上讲,这意味着对象处于析构函数保留它的任何状态,这对于某些对象可能与默认构造相同(但您永远不应该依赖它)。

为什么它们是合理的?

有时您需要在不释放内存的情况下销毁对象。这发生在很多类中,比如变体/任何、各种脚本绑定和反射系统、一些单例实现等。

例如,您可以使用std::aligned_storage为一个对象分配一个缓冲区,然后使用placement new 在该缓冲区中构造一个对象。你不能调用delete这个对象,因为它会调用析构函数并尝试释放支持它的内存。在这种情况下,您必须显式调用析构函数才能正确销毁对象。

除了放置删除之外,我们还可以在哪些情况下显式调用析构函数?

除了放置 new 的相应运算符之外,实际上并没有诸如“放置删除”之类的东西(并且任何调用都delete将隐式调用析构函数,除非编译器为构造失败而调用的那些,例如您的“放置删除”概念)。

我在上面给出的一个例子。另一个例子是std::vector。您可以调用成员函数,例如pop_back(). 这需要破坏向量中的最后一个元素,但它不能使用delete,因为支持对象的内存是必须单独管理的更大缓冲区的一部分。许多其他容器也是如此,例如开放寻址哈希表,deque等等。这是您想要使用template typename来显式调用析构函数的示例。

这是一个库的用户很少需要的功能,但是像 STL 甚至一些应用程序框架这样的低级库的实现者将需要在这里和那里使用。

平方怎麼打? 教你各平台X² 平方符號的輸入方法
前斗鱼炉石主播熊大出狱:对不起 感谢水友们