Hug*_*ing 1 c++ delete-operator
当您尝试删除非指针类型但未显示时,会发生编译器错误,并且仅在运行时崩溃.我浪费了整整2天的时间,认为它是一个实际的指针变量,并且由于代码中其他地方的堆损坏而崩溃了.最后我意外地查看了被删除变量的声明,发现它根本不是指针类型.
最后我意外地查看了被删除变量的声明,发现它根本不是指针类型.
这是错误的-编译器不会给你一个错误,当您尝试删除一个变量,它是类型的指针不是:
$ 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;
^
Run Code Online (Sandbox Code Playgroud)
但是,编译器将接受任何类型,之后delete可以隐式转换为指针.这可以说是我们想要的 - 隐式转换意味着我们要"将这个变量看作是一个指针".另一方面,在上下文中可能永远不会出现这种情况delete,并且C++语言在这里可能更具限制性.
也就是说,确定指针是否指向有效的堆分配内存是不可能的 - 它等同于解决暂停问题,因此在一般情况下可证明是无法解决的.