【发布时间】:2018-10-21 17:32:20
【问题描述】:
我有以下情况。
FooClass* fooPointer = new FooClass();
int main() {
while (/*logic*/) {
if (fooPointer) {
// some logic
}
}
}
class FooClass {
void fooClass::fooMethod() {
if (/*logic*/) {
//logic
delete this;
}
}
}
所以我基本上是在删除对象。但是在下一次迭代时还是会进入main方法中的if语句(
if (fooPointer) {
// some logic
}
)。
为什么它不能通过空检查识别出该对象已被删除?
【问题讨论】:
-
delete不会将指针设置为空。它根本不会改变它。你应该重新考虑你的设计,这是错误的道路。 -
问个问题,为什么while循环里面的
// some logic不是确定,然后删除fooPointer那里,然后设置为nullptr?尽管有 COM 对象的实现,delete this;几乎总是一种设计气味。 -
最好使用 std::unique_ptr,可能带有自定义删除器。
-
@WhozCraig 至于你的问题,因为删除逻辑在 FooClass 中的许多嵌套方法之一中
-
@john 我怀疑,但香气一样腐烂。充其量(我用这个词很松散,因为这感觉就像我在促成一个糟糕的设计的犯罪),
FooClass构造函数可以引用一个指向自毁的清除指针,保留为FooClass实例的一部分,并在delete this;之前立即无效。这是一个可怕的解决方案画在角落。不管怎样,如果你保持这个设计,你必须有一个指向外部拥有指针的路径,以免你让它悬空,而目前你没有。
标签: c++