我很难理解如何在 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.
如果您只能通过分离声明和分配以安全的方式分配基于堆的数组,那么生产代码无法使用基于栈的数组,不是吗?
我认为这主要是一种脑力锻炼。我一直在考虑它,但我没有看到任何地方说明这一点。 hugeNumber 在现实中是相对的。实际上,即使是正常的数字也会导致分配失败,并且由于似乎没有一种方法可以安全地分配基于堆栈的数组,所以我问的是显而易见的......“基于堆栈的数组可以用于生产代码吗?”。我问以防万一有一些我不知道的语法。我真的很感激你的意见。
最佳答案
Realistically even a normal number can cause a failed allocation and since there does not appear to be a way to safely allocate a stack based array I am asking the obvious...
这适用于所有自动变量,而不仅仅是数组。如果您不能确定是否有足够的堆栈内存用于“正常”大小的数组,那么您如何确定是否有足够的内存用于单个对象?
堆栈内存是有限的,但与“正常”大小的对象和数组相比,它仍然很大。
Can stack based arrays be used in production code?
当然。自动数组可以在生产代码中使用,就像任何自动对象都可以(事实上,必须)在生产中使用一样。您根本无法使用 巨大 自动对象。
自动对象的实际大小限制究竟在哪里,在很大程度上取决于具体情况。您使用的自动存储越多,分析使用的最大堆栈大小就越相关。
为避免生产中的堆栈溢出,应在部署前进行测试。如果堆栈溢出发生在测试运行中,有些工具会检测到它。
Obviously this will not work because the array would not be accesible outside of try.
try{ int a[hugeNumber]; } catch(std::bad_alloc& e) { }
它也不会工作,因为堆栈溢出不会抛出异常。
I asked just in case there is some syntax I'm not aware off.
没有“尝试”分配自动对象(包括数组)的语法。在 C++ 中也没有办法检查有多少内存可用于自动存储,尽管可能有系统特定的方法。
关于c++ - 堆栈分配数组的安全分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48160524/