我很难看到如何在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在现实中是相对的.实际上,即使是正常的数字也可能导致分配失败,并且因为似乎没有办法安全地分配基于堆栈的数组,我要求显而易见的......"可以在生产代码中使用基于堆栈的数组吗?".我问以防万一有一些我不知道的语法.我真的很感激输入.
实际上即使是正常的数字也会导致分配失败,因为似乎没有办法安全地分配基于堆栈的数组,我问的是显而易见的......
这适用于所有自动变量,而不仅仅是数组.如果你不能确定"普通"大小的数组有足够的堆栈内存,那么你怎么能确定单个对象是否有足够的内存?
堆栈内存有限,但与"普通"大小的对象和数组相比仍然很大.
可以在生产代码中使用基于堆栈的数组吗?
当然.自动数组可以在生产代码中使用,就像任何自动对象可以(实际上必须)在生产中使用一样.你根本无法使用巨大的自动对象.
确切地说,自动对象的实际尺寸限制在很大程度上是非常情况化的.您使用的自动存储越多,分析使用的最大堆栈大小就越相关.
为避免生产中的堆栈溢出,应在部署之前进行测试.如果在测试运行中发生堆栈溢出,有些工具会检测到堆栈溢出.
显然这不起作用,因为数组在try之外是不可访问的.
Run Code Online (Sandbox Code Playgroud)try{ int a[hugeNumber]; } catch(std::bad_alloc& e) { }
它也不起作用,因为堆栈溢出不会引发异常.
我问以防万一有一些我不知道的语法.
没有语法可以"尝试"分配自动对象(包括数组).在C++中也无法检查可用于自动存储的内存量,尽管可能存在特定于系统的方式.
| 归档时间: |
|
| 查看次数: |
354 次 |
| 最近记录: |