gpt4 book ai didi

c++ - 为什么 new[-1] 会产生 segfault,而 new[-2] 会抛出 bad_alloc?

转载 作者:IT老高 更新时间:2023-10-28 23:15:15 28 4
gpt4 key购买 nike

我尝试通过将一些否定参数传递给 new[] 来测试 bad_alloc 异常。当传递小的负数时,我得到了我所希望的 - bad_alloc。但是,当传递 -1 时,我可以看到我的对象被构​​造了数千次(我在构造函数中打印静态计数器)并且应用程序因段错误而终止。

new[] 将有符号整数转换为 size_t,所以 -1size_t-2最大值 - 1 以此类推。

那么为什么new[]在接收到一个巨大的数字时会抛出异常,但在接收到size_t的最大值时会尝试分配呢? new[]1111...11111...0 有什么区别? :)

提前致谢!

最佳答案

这是我的猜测:

在很多实现中,分配器会在分配的区域旁边放置一些元数据。
(例如,分配的大小。)因此,实际上,您分配的数量超出了您的要求。

假设 size_t 是 32 位。编译为 32 位。


当你这样做时:

int *array = new int[-1];

-1 变为 -1 * 4 bytes = 4294967292(溢出后)。但是如果分配器实现将 4 字节的元数据放在分配的区域旁边。实际大小变为:

4294967292 + 4 bytes = 0 bytes (after overflow)

所以实际上分配了 0 个字节。

当您尝试访问内存时,您会立即出现段错误。


现在假设你这样做了:

int *array = new int[-2];

-2 变为 -2 * 4 bytes = 4294967288(溢出后)。附加 4 字节的元数据,你会得到 4294967288 + 4 = 4294967292

当分配器向操作系统请求 4294967292 字节时,它会被拒绝。所以它会抛出 bad_alloc


所以基本上,-1-2 可能会在分配器附加其元数据后是否会溢出之间产生差异。

关于c++ - 为什么 new[-1] 会产生 segfault,而 new[-2] 会抛出 bad_alloc?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9680989/

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