gpt4 book ai didi

c++ - 在p=new string[0]和p=new int[0]之后,为什么string版本在delete[] p时会崩溃?

转载 作者:IT老高 更新时间:2023-10-28 22:38:55 27 4
gpt4 key购买 nike

我有两段关于 new[]delete[] 的代码:

1)

#include <string>

int main()
{
std::string *p = new std::string[0];
delete[] p;

return 0;
}

2) 在这种情况下,我只是将 std::string 更改为 int

int main()
{
int *p = new int[0];

delete[] p;

return 0;
}

我的问题是:

为什么第一个程序崩溃并显示以下消息(在 linux 环境中):

Segmentation fault (core dumped)

但是第二个程序运行良好,没有任何错误?

编辑

编译器:g++ (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2

我只是使用 g++ 没有任何参数来编译它。

如果是编译器的bug,按照标准是应该崩​​溃还是不崩溃?

最佳答案

这应该是一个 gcc 错误。整个 new[] 表达式被忽略并且 p 变得未初始化,然后我们 delete[] 一个未初始化的指针崩溃。如果我们用 -Wall 编译程序,它会警告你

warning: ‘p’ is used uninitialized in this function

这显然是错误的。表达式 new X[0] 在 C++03 和 C++11 (§5.3.4/7) 中都有很好的定义,这在 clang 中可以正常工作,所以唯一合乎逻辑的结论是不是 gcc 的错误。


new[] 消除错误仅在要构造的类型具有任何非平凡构造函数时存在。并且段错误发生在类型具有析构函数,因为 delete[] 然后将需要取消引用该未初始化的指针。因此,它会为 std::string 而不是 int 崩溃,因为 int 是微不足道的,而 std::string不是。


这可以通过使用中间变量来解决,这样表达式就不能直接计算为 0:

size_t length = 0;
std::string* p = new std::string[length];
// ...
delete[] p;

关于c++ - 在p=new string[0]和p=new int[0]之后,为什么string版本在delete[] p时会崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13158882/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com