安全分配堆栈分配的数组

时间:2018-01-09 02:05:54

标签: c++ c++11

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

通常人们这样做:

int a[hugeNumber]{0};  //declare,allocate,inti to 0.

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

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

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

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

//code here can't use a because of scope.

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

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

2 个答案:

答案 0 :(得分:6)

  

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

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

堆栈内存是有限的,但它仍然是巨大的比较"正常"大小的对象和数组。

  

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

不确定。自动数组可以在生产代码中使用,就像任何自动对象都可以(实际上必须)在生产中使用一样。您根本无法使用巨大的自动对象。

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

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

  

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

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

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

  

我问过,以防有一些语法我不知道。

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

答案 1 :(得分:0)

  

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

这需要使用new进行动态分配,例如:

int *a = nullptr;
try
{
    a = new int[hugeNumber];
}
catch(const std::bad_alloc &e)
{
    ... 
}
...
delete[] a;

或者:

std::vector<int> a;
try
{
    a.resize(hugeNumber);
}
catch(const std::bad_alloc &e)
{
    ... 
}
...