gpt4 book ai didi

c++ - 为什么在 size_t 的情况下抛出 bad_alloc() 异常

转载 作者:可可西里 更新时间:2023-11-01 14:42:31 26 4
gpt4 key购买 nike

我正在处理下面的代码,当我执行这段代码时,我得到了一个 std::bad_alloc 异常:

int _tmain(int argc, _TCHAR* argv[])
{
FILE * pFile;

size_t state;
pFile = fopen("C:\\shared.tmp", "rb");
if (pFile != NULL)
{
size_t rt = fread(&state, sizeof(int), 1, pFile);
char *string = NULL;
string= new char[state + 1];
fclose(pFile);
}
return 0;
}

下面这行导致抛出异常:

string = new char[state + 1];

为什么会发生这种情况,我该如何解决?

最佳答案

您正在传递一个未初始化的 64 位(8 字节,在现代 64 位系统上)变量的地址,state , 并告诉 fread阅读sizeof(int) (32 位,在相同的系统上为 4 个字节)字节从文件到这个变量。

这将用读取的值覆盖变量的 4 个字节,但保留其他 4 个未初始化。它覆盖哪 4 个字节取决于架构(在 Intel CPU 上最不重要,在配置大端字节序的 ARM 上最重要),但无论哪种方式,结果很可能都是垃圾,因为 4 个字节未初始化并且可能包含任何内容.

在您的情况下,它们很可能是最重要的字节,并且至少包含一个非零位,这意味着您随后尝试分配远远超过 4GB 的内存,而您没有。

解决方案是制作state一个std::uint32_t (因为您显然希望文件包含 4 个字节,代表一个无符号整数;不要忘记包含 <cstdint> )并传递 sizeof(std::uint32_t) ,并且通常确保对于每个 fread和传递指针和大小的类似调用,您确保指针指向的东西实际上具有您传递的大小。通过 size_t*sizeof(int)在 64 位系统上不满足这些要求,并且由于不能保证 C++ 的基本类型的大小,您通常根本不想将它们用于二进制 I/O。

关于c++ - 为什么在 size_t 的情况下抛出 bad_alloc() 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38302403/

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