c++ - 为什么在非指针堆栈分配变量上调用 delete 时 C++ 不给出编译器错误?

标签 c++ delete-operator

<分区>

当你试图删除一个非指针类型但它没有显示,并且只在运行时崩溃时,人们会预料到编译器错误。我浪费了整整 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/

相关文章:

C++删除错误

c++ - c++删除指针数组中每个元素指向的对应元素

c++ - 我应该如何部署 MFC 应用程序?

c++ - 正确修复转换和数据丢失警告?

C++ CRTP 名称查找

c++ - 在析构函数中删除[],在构造函数中分配

c++ - FT_Read 失败,除非逐字节读取,其中每个 FT_Read 后跟 FT_Purge

c++ - OpenCV findFundamentalMat 是否在计算前应用归一化

c++ - 在另一个类中完成删除时出现 Valgrind 错误

c++ - 删除缓冲区溢出 []