【问题标题】:How to calculate if a dynamic memory request will cause an invalid allocation如何计算动态内存请求是否会导致无效分配
【发布时间】:2014-11-15 21:29:29
【问题描述】:

在尝试使用 new 进行动态内存分配时,我发现可以请求大量内存,以至于实现不会引发 bad_alloc 异常,而只是因无效分配错误而崩溃。我尝试使用一个简单的测试来测试分配的大小

    if (n >= SIZE_MAX / sizeof(double)) 
        // throw some exception
    else 
        // try to allocate memory

其中 n 是我尝试分配的双精度数,但我发现通过此测试的请求仍然会导致程序崩溃。是否有一个简单的可移植测试可以确定请求是否安全?

感谢您的宝贵时间。

编辑:抱歉,这是一个在我的系统上崩溃的程序示例。我使用 Visual Studio 2013 创建了该程序。

#include <cstdint>
#include <new>

int main()
{
    size_t n = SIZE_MAX / sizeof(double);
    double* ptr;

    try {
        new double[n];
        } catch (std::bad_alloc& e){ };
 }

【问题讨论】:

  • 我很确定它不应该崩溃。您是否尝试过一个最小的示例(即,您能否确定代码中没有隐藏其他错误=> undef.behavior & co)?编译器、操作系统...?
  • 如果是编译器错误,您可以尝试使用 gcc 吗?
  • 我这个系统上其实只有VS。
  • 接受的答案规定了我在最初问题中提到的相同测试。事实上,这正是我发现上述测试的地方。我创建一个新问题的原因是因为我的系统上的测试失败了。

标签: c++ dynamic-memory-allocation


【解决方案1】:

我相信您遇到此错误的原因是因为您尝试分配 4GB 内存,在 Visual Studio 中,您将有一个可以在程序中总共分配的最大大小,这个值可以在配置。如果您尝试在发布模式下运行程序,它应该会消失,因为 Visual Studio 没有安全签入发布。

希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-16
    • 2013-09-16
    • 1970-01-01
    • 1970-01-01
    • 2020-06-01
    相关资源
    最近更新 更多