当内存不足时,c ++分配器会使应用程序崩溃

时间:2019-01-07 19:55:56

标签: c++ c++11 stl

当分配器由于内存有限而失败时。该应用程序崩溃了。抛出 bad_alloc 或返回 nullptr 不会停止崩溃。有人知道吗?

pointer allocator<T>(size_type count) const
{
    void* buffer = new (count * sizeof(T));
    if (!buffer)         // if buffer == nullptr crashes app
        throw bad_alloc; // doing this crashes app
    /* or alternatively
     * try {
     *     void* buffer = new (count * sizeof(T));
     * } catch (const std::exception& e) {
     *     std::cerr << "failed to allocate " << count << std::endl;
     *     return nullptr;
     * }
     */
}

那么如何正常关闭应用程序并说没有足够的内存呢?

2 个答案:

答案 0 :(得分:1)

不传播异常需要做很多事情,标准通过指定std::terminate来实现(如果异常会以其他方式逸出),则可以做到这一点。

没有程序其余部分的上下文,我们不知道这是其中之一,还是仅留下main的异常。

对后者的修复可能看起来像

int main()
{
    try 
    {
        // whatever here
    }
    catch (std::exception & e)
    {
        std::cerr << e.what();
        return EXIT_FAILURE;
    }
}

答案 1 :(得分:0)

new操作符会自己抛出bad_alloc!因此,请使用try-catch块:

pointer allocator<T>(size_type count) const
{
    try
    {
        void* buffer = new (count * sizeof(T));
    }
    catch (bad_alloc& ba)
    {
        return nullptr; // or do whatever you have to do to recover
    }
}

另请参见here