在这篇文章中:
用户Eric Postpischil提出了一个答案,他主动调用了类的析构函数.这合法吗?它被认为是好的编程吗?
我问的原因是,在我的一个课程中,我的老师说这是禁止的,我们不应该这样做,他错了吗?
帖子上的问题和答案本身虽然有趣,但与我的问题并不相关.
好吧,就像创建动态对象的过程可以"分解"成两个阶段:原始内存分配和实际初始化(例如构造函数通过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()- 它是非法的.别名类型名必须用于非类类型.)