积极地调用析构函数

Rav*_*erg 4 c++ destructor

在这篇文章中:

C++指针:更改内容而不更改地址?

用户Eric Postpischil提出了一个答案,他主动调用了类的析构函数.这合法吗?它被认为是好的编程吗?

我问的原因是,在我的一个课程中,我的老师说这是禁止的,我们不应该这样做,他错了吗?

帖子上的问题和答案本身虽然有趣,但与我的问题并不相关.

AnT*_*AnT 5

好吧,就像创建动态对象的过程可以"分解"成两个阶段:原始内存分配和实际初始化(例如构造函数通过placement-new调用),破坏动态对象的过程也可以"反汇编"分为两个阶段:实际的去初始化(析构函数调用)和原始内存释放.(正如您所看到的,这两个过程是彼此的镜像.)

这在您想要使用自己的原始内存分配/释放机制的情况下非常有用.当然,在许多情况下,您可以通过重载实现所需的效果operator new/delete,但在某些情况下,它不够灵活,您可能更愿意明确执行上述步骤.

所以,这是直接析构函数调用是一个有用功能的一个例子.还有很多其他人.是的,这是完全合法的.

当你的班主任说你永远不应该这样做时,他/她可能意味着你应该在你现在的课程范围内避免它.当你在学习中取得进步时,你会明白许多"你永远不应该这样做"的技巧实际上是非常有用的技术,属于"做那个,如果你知道你在做什么"类别.当然,你不应该滥用这种技术,因为它确实是一种低级技术.

PS此语法正式称为 - 析构函数调用,因为它允许您"调用"不存在的析构函数

typedef int INT;

INT i;
i.~INT(); // <- legal code, pseudo-destructor call, no op
Run Code Online (Sandbox Code Playgroud)

以上是合法的C++代码,尽管它INT不是类类型,因此没有析构函数.(只是不要尝试i.~int()- 它是非法的.别名类型名必须用于非类类型.)