我很难看到如何在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 ;.我问以防万一有一些语法我不知道。我真的很感激输入。
答案 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)
{
...
}
...