gpt4 book ai didi

c++ - Bad_alloc 没有在我期望的时候抛出

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:44:18 26 4
gpt4 key购买 nike

考虑这个简单的程序:

#include <exception>
#include <iostream>

int main(void)
{
const std::size_t size = 1<<31;
int *a = NULL;

try
{
a = new int[size];
}
catch (std::exception &e)
{
std::cerr << "caught some bad guy" << std::endl;
return 1;
}

if (a == NULL)
{
std::cerr << "it's null, can't touch this" << std::endl;
return 1;
}

std::cerr << "looks like 'a' is allocated alright!" << std::endl;

for (size_t i = 0; i < size; i ++)
std::cout << a[i] << " ";

return 0;
}

评论

  • 我尝试分配一些荒谬的内存:(1<<31) * sizeof(int) == 8GB
  • 我添加安全检查
    • 捕捉 std::exception ,应该 catch std::bad_alloc除其他异常(exception)...
    • 检查它是否不为空(即使要使此检查真正有意义,我需要 a = new (std::nothrow) int[size] - 但无论我如何分配内存,它都不起作用)

环境

  • 安装内存:2GB
  • 操作系统:Debian
  • 架构:32 位

问题

问题是程序没有提前退出,而是做了这样的事情:

rr-@burza:~$ g++ test.cpp -o test && ./test
looks like 'a' is allocated alright!
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
(...many other zeros here...)
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0Segmentation fault

打印的零数恰好是 33790,这完全告诉我……什么都没有。如何使我的程序防段错误?

最佳答案

这似乎是您环境中的一个错误,它会导致 new[] 实现中的整数溢出。实际上,您正在分配 0 个字节。可能是 this bug . C++03 标准不清楚应该发生什么,在 C++11 中应该抛出 std::bad_array_new_length

如果你需要支持这个系统你可以在分配之前检查是否有溢出的机会,例如:

size_t size_t_max = -1;
if (size > size_t_max / sizeof(int))
throw ...;

但是,如果您使用的库没有此类检查(例如 std::vector 的实现),此错误可能仍会影响您。

关于c++ - Bad_alloc 没有在我期望的时候抛出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22391296/

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