【发布时间】:2018-05-01 09:50:57
【问题描述】:
如果是这样,为什么下面的代码会给我警告
注意:无论是析构函数还是类特定操作符 delete 都不会被调用,即使它们是在定义类时声明的
?
struct C;
int main()
{
C *c = nullptr;
delete c;
return 0;
}
我理解如果C 具有非平凡/虚拟析构函数,但不是标准保证/定义,为什么它可能在一般情况下是未定义的行为无论情况如何,nullptr 上的 delete 始终是 noop?
重申一下:我专门询问指向不完整类型的指针是nullptr!
【问题讨论】:
-
事实上,编译器给你一个警告并不意味着代码是错误的。例如未使用的变量。这通常意味着代码不安全。
-
对我来说这个问题没有多大意义。要么,您计划
c始终为 NULL,那么您根本不需要 delete 行,或者您最终允许稍后为其分配一些值,在这种情况下您需要完整的类型定义... -
@Fang 我的问题是针对不完整类型的。
-
@Slava 很好,是的。这就是为什么我决定要求确定。至少这种情况对于编译器来说似乎很容易弄清楚并且不发出警告(但话又说回来,他们可能只是懒得实现这种极端情况)。
-
好吧,
C *c = nullptr; delete c;无论如何都不应该存在,因为它什么都不做,编译器确实能够检测到这一点并对其进行优化。但是这样的代码表明你的代码有问题,在编译器中实现这种特殊情况是不值得的。
标签: c++ language-lawyer delete-operator incomplete-type nullptr