- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在这篇文章中:
C++ Pointer: changing the contents without changing the address?
用户 Eric Postpischil 提出了一个他主动调用类的析构函数的答案。合法吗?它被认为是好的编程吗?
我问的原因是,在我的一节课上,我的老师说这是被禁止的,我们永远不应该这样做,他错了吗?
帖子中的问题和答案本身,虽然很有趣,但与我的问题并没有真正相关。
最佳答案
好吧,就像动态对象的创建过程可以“拆解”成两个阶段:原始内存分配和实际初始化(例如通过 placement-new 调用构造函数)一样,动态对象的销毁过程也可以是“反汇编”分为两个阶段:实际去初始化(析构函数调用)和原始内存释放。 (如您所见,这两个进程互为镜像。)
这在您想使用自己的原始内存分配/释放机制的情况下非常有用。诚然,在许多情况下您可以通过重载 operator new/delete
来达到预期的效果,但在某些情况下它不够灵活,您可能更愿意明确地执行上述步骤。
所以,这里有一个例子说明直接析构函数调用何时是一项有用的功能。还有很多其他的。是的,这是完全合法的。
当您的类主任说您永远不应该这样做时,他/她的意思可能是您现在应该在当前类(class)范围内避免这样做。随着你学习的进步,你会明白很多“你永远不应该那样做”的技巧实际上是非常有用的技巧,属于“如果你知道自己在做什么,就去做”的范畴。当然,你不应该滥用这种技术,因为它确实是一种低级技术。
附言这种语法正式称为伪-析构函数调用,因为它允许您“调用”不存在的析构函数
typedef int INT;
INT i;
i.~INT(); // <- legal code, pseudo-destructor call, no op
以上是合法的 C++ 代码,尽管 INT
不是类类型,因此没有析构函数。 (只是不要尝试执行 i.~int()
- 这是非法的。别名必须用于非类类型。)
关于c++ - 主动调用析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16950828/
我是一名优秀的程序员,十分优秀!