<分区>
当你试图删除一个非指针类型但它没有显示,并且只在运行时崩溃时,人们会预料到编译器错误。我浪费了整整 2 天的时间,以为它是一个实际的指针变量,并且由于代码中其他地方的堆损坏而崩溃。最后无意中看了一下被删除变量的声明,发现根本不是指针类型。
<分区>
当你试图删除一个非指针类型但它没有显示,并且只在运行时崩溃时,人们会预料到编译器错误。我浪费了整整 2 天的时间,以为它是一个实际的指针变量,并且由于代码中其他地方的堆损坏而崩溃。最后无意中看了一下被删除变量的声明,发现根本不是指针类型。
最佳答案
Finally accidentally I looked at the declaration of the variable being deleted and found it wasn't a pointer type at all.
这是错误的——当您试图删除一个非指针类型的变量时,编译器会给您一个错误:
$ cat test.cpp
int main() {
int a;
delete a;
}
$ g++ test.cpp
test.cpp: In function 'int main()':
test.cpp:3:12: error: type 'int' argument given to 'delete', expected pointer
delete a;
^
但是,编译器将接受delete
后可隐式转换为指针的任何类型。这可以说是我们想要的——隐式转换意味着我们想要“把这个变量当作一个指针来对待”。另一方面,在 delete
的上下文中,确实可能永远不会出现这种情况,并且 C++ 语言在此处可能更具限制性。
也就是说,确定一个指针是否指向有效的堆分配内存是不可能的——这等同于解决 halting problem因此在一般情况下无法证明。
关于c++ - 为什么在非指针堆栈分配变量上调用 delete 时 C++ 不给出编译器错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17564819/