【发布时间】:2015-07-30 09:02:13
【问题描述】:
我有这个代码:
struct data {
void doNothing() {}
};
int main() {
data* ptr = new data();
ptr->~data();
ptr->doNothing();
::operator delete(ptr);
}
请注意,doNothing() 是在对象被销毁之后但在其内存被释放之前被调用的。看起来“对象生命周期”已经结束,但是指针仍然指向正确分配的内存。成员函数不访问任何成员变量。
在这种情况下,成员函数调用是否合法?
【问题讨论】:
-
不管答案如何,这对于以后尝试维护代码的任何人来说都是非常混乱的。不要这样做,即使它以某种方式证明是合法的(或在特定情况下工作)。我想说这是不合法的,但我已经有一段时间没有阅读 C++ 规范了,我可能错了。
-
如果你的数据结构真的没有析构逻辑,为什么要先调用析构函数再调用成员函数。如果您期望析构函数发生变化,则不应依赖于琐碎的行为。在较大的应用程序中,主文件中的数据和代码可能位于不同的源文件中,而更改其中一个的开发人员可能不知道另一个的内容。
-
@xxbbcc 假设调用来自其他人编写的模板。
-
非常有趣的问题;但是,我想知道 - 如果成员函数不访问任何成员,是否可以将其设为
static使其与任何实例断开连接? -
不,这是不合法的。已派出警官。
标签: c++ destructor language-lawyer object-lifetime explicit-destructor-call