安全分配堆栈分配的数组

cod*_*ode 3 c++ c++11

我很难看到如何在C++中安全地分配堆栈数组.

通常人们这样做:

int a[hugeNumber]{0};  //declare,allocate,inti to 0.
Run Code Online (Sandbox Code Playgroud)

由于堆栈溢出,这很容易失败.

我想以某种方式拆分声明和分配,并在try catch中进行分配.

显然这不起作用,因为数组在try之外是不可访问的.

try{
    int a[hugeNumber];
}
catch(std::bad_alloc& e)
{
}

//code here can't use a because of scope.
Run Code Online (Sandbox Code Playgroud)

如果你只能通过分离声明和分配以安全的方式分配基于堆的数组,那么生成代码就无法使用基于堆栈的数组,不是吗?

我认为这主要是一种心理锻炼.我一直在考虑它,我没有看到任何地方说明问题.largeNumber在现实中是相对的.实际上,即使是正常的数字也可能导致分配失败,并且因为似乎没有办法安全地分配基于堆栈的数组,我要求显而易见的......"可以在生产代码中使用基于堆栈的数组吗?".我问以防万一有一些我不知道的语法.我真的很感激输入.

eer*_*ika 6

实际上即使是正常的数字也会导致分配失败,因为似乎没有办法安全地分配基于堆栈的数组,我问的是显而易见的......

这适用于所有自动变量,而不仅仅是数组.如果你不能确定"普通"大小的数组有足够的堆栈内存,那么你怎么能确定单个对象是否有足够的内存?

堆栈内存有限,但与"普通"大小的对象和数组相比仍然很大.

可以在生产代码中使用基于堆栈的数组吗?

当然.自动数组可以在生产代码中使用,就像任何自动对象可以(实际上必须)在生产中使用一样.你根本无法使用巨大的自动对象.

确切地说,自动对象的实际尺寸限制在很大程度上是非常情况化的.您使用的自动存储越多,分析使用的最大堆栈大小就越相关.

为避免生产中的堆栈溢出,应在部署之前进行测试.如果在测试运行中发生堆栈溢出,有些工具会检测到堆栈溢出.


显然这不起作用,因为数组在try之外是不可访问的.

try{
    int a[hugeNumber];
}
catch(std::bad_alloc& e)
{
}
Run Code Online (Sandbox Code Playgroud)

它也不起作用,因为堆栈溢出不会引发异常.


我问以防万一有一些我不知道的语法.

没有语法可以"尝试"分配自动对象(包括数组).在C++中也无法检查可用于自动存储的内存量,尽管可能存在特定于系统的方式.