Yis*_*ang 14 c++ pointers new-operator delete-operator
我有两个代码块new[]和delete[]:
1)
#include <string>
int main()
{
std::string *p = new std::string[0];
delete[] p;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
2)在这种情况下,我只是std::string改为int
int main()
{
int *p = new int[0];
delete[] p;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:
为什么第一个程序崩溃时出现以下消息(在linux环境中):
Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)
但第二个程序运行良好没有任何错误?
编辑
编译: g++ (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2
我只是使用g++没有任何参数来编译它.
如果是编译器错误,它们是否会根据标准崩溃?
ken*_*ytm 13
这应该是一个gcc bug.整个new[]表达式被忽略并p变得未初始化,然后我们将delete[]一个未初始化的指针崩溃.如果我们用-Wall它编译程序,它会警告你
警告:'p'在此函数中未初始化使用
这显然是错的.该表达式new X[0]在C++ 03和C++ 11(§5.3.4/ 7)中都有明确定义,并且这在clang中正常工作,因此唯一合乎逻辑的结论是它是一个gcc错误.
new[]只有当要构造的类型具有任何非平凡的构造函数时,才会消除bug.并且segfault发生类型有一个析构函数,因为delete[]然后需要取消引用那个未初始化的指针.因此,它崩溃std::string但不是int,因为int是微不足道而std::string不是.
这可以通过使用中间变量来解决,这样表达式不能直接求值为0:
size_t length = 0;
std::string* p = new std::string[length];
// ...
delete[] p;
Run Code Online (Sandbox Code Playgroud)