c++ - 堆栈分配数组的安全分配

标签 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.

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

我认为这主要是一种脑力锻炼。我一直在考虑它,但我没有看到任何地方说明这一点。 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/

相关文章:

c++ - HTTP 响应编码的包装器

c++ - 如何在不关闭服务器套接字的情况下在 C++ 客户端的主循环中接收数据?

C++ 对二进制表达式 ('IOperand *' 和 'IOperand *' 的无效操作数)

c++11 - 作为参数和返回类型的通用引用

c++ - 为了清楚起见,您是否应该将 .h 文件中已经包含的所有内容都包含在 .cpp 文件中?

c++ - 当指向基类的指针指向特定子类时有条件地中断的断点

c++ - 离开方法时访问冲突

c++ - 正则表达式 STL 不工作

c++ - 确保 move 构造函数存在时永远不会调用复制构造函数

c++ - new struct{} 的列表初始化是否使用特定于编译器的变量?