簡體   English   中英

我期望它不會拋出Bad_alloc

[英]Bad_alloc not thrown when I expect it to

考慮這個簡單的程序:

#include <exception>
#include <iostream>

int main(void)
{
    const std::size_t size = 1<<31;
    int *a = NULL;

    try
    {
        a = new int[size];
    }
    catch (std::exception &e)
    {
        std::cerr << "caught some bad guy" << std::endl;
        return 1;
    }

    if (a == NULL)
    {
        std::cerr << "it's null, can't touch this" << std::endl;
        return 1;
    }

    std::cerr << "looks like 'a' is allocated alright!" << std::endl;

    for (size_t i = 0; i < size; i ++)
        std::cout << a[i] << " ";

    return 0;
}

評論

  • 我嘗試分配一些荒謬的內存: (1<<31) * sizeof(int) == 8GB
  • 我加上安全檢查
    • 捕獲std::exception ,它應該在其他異常中捕獲std::bad_alloc ...
    • 檢查它是否不為空(即使這個檢查實際上有意義,我需要a = new (std::nothrow) int[size] - 但不管我如何分配內存,它都不起作用)

環境

  • 安裝RAM:2GB
  • 操作系統:Debian
  • 架構:32位

問題

問題是程序,而不是提前退出,做這樣的事情:

rr-@burza:~$ g++ test.cpp -o test && ./test
looks like 'a' is allocated alright!
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
(...many other zeros here...)
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0Segmentation fault

打印的零數正好是33790,這正好告訴我......什么都沒有。 如何使我的程序具有段錯誤?

這似乎是您環境中的一個錯誤,它會導致new[]實現中出現整數溢出。 實際上,您正在分配0個字節。 可能是這個錯誤 C ++ 03標准不清楚應該發生什么,在C ++ 11中應該拋出std::bad_array_new_length

如果您需要支持此系統,您可以在分配之前檢查是否有溢出的可能性,例如:

size_t size_t_max = -1;
if (size > size_t_max / sizeof(int))
    throw ...;

如果您使用的庫沒有這樣的檢查(例如std::vector實現),則此錯誤可能仍然會影響您。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM