簡體   English   中英

C++,標准庫異常

[英]C++, Standard library Exceptions

在 C++ 中,“new.h”定義了下面的 class

class bad_alloc : public exception 
{
   public:
        bad_alloc() throw() { }
        virtual ~bad_alloc() throw();
};

構造函數和析構函數都明確指定不拋出異常,它沒有其他成員函數,但它繼承了“異常”class。

我的假設是“新”運算符使用此 class 在分配期間發生錯誤時引發異常。 但是怎么做? 沒有有效的成員function,代碼中實際是怎么使用的?

我想知道,這個 class "bad_alloc" 聲明的用途是什么? 請幫我。

不需要成員函數 - 這是完全有效的:

throw 42;

大多數情況下,我們對異常的類型感興趣,而不是其他。 然而,標准異常確實從異常基礎 class 繼承了一些函數。

異常並不真的需要有成員。 您聲明這些類,以便您可以顯式捕獲它們:

try {
    Foo * foo = new Foo();
}
catch(std::bad_alloc &) {
    std::cout << "could not allocate" << std::endl;
}

類型的名稱是所需的所有信息。 上面的語句將只捕獲bad_alloc及其所有子類。

有效的成員函數繼承自exception bad_alloc的目的是當您查找runtime_errorlogic_error時不會捕獲它。

沒有有效的成員function,代碼中實際是怎么使用的?

此 class 的目的僅僅是向(向new的調用者)發出分配失敗的信號(= 缺少可用內存)。 它不需要任何成員函數。

創建 class 的 object 然后拋出: throw bad_alloc(); . 本質上,您可以拋出任何 object 或值。 然后可以在catch()語句中使用它的類型來僅抓取這種異常。

例子:

try
{
   // some code throwing exceptions
}
catch(const bad_alloc&)
{
    // this code is only run if an object of class bad_alloc is thrown
}
catch(const exception&)
{
    // this code is run if an object of class exception (or any unhandled derivated class) is thrown
}

您也可以忽略此類類並僅拋出字符串(拋出“發生錯誤。”),但您無法區分它們,因此您要么處理所有字符串,要么不處理。

這是新操作員的代碼。 沒什么特別的。 它只是拋出這個 class 的一個實例。

#define _RAISE(x)   throw (x)

void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
        {       // try to allocate size bytes
        void *p;
        while ((p = malloc(size)) == 0)
                if (_callnewh(size) == 0)
                {       // report no memory
                static const std::bad_alloc nomem;
                _RAISE(nomem);
                }

        return (p);
        }

這是在某些例程未能分配 memory 的情況下引發的異常。 如果你想發出這樣的信號,它就像這樣使用:

throw std::bad_alloc();

此外,如果你想捕捉 memory 分配錯誤,它是這樣的:

try {
    ...do something here...
} catch (const std::bad_alloc& ex) {
    ...print an error message or handle the exception in some other way...
}

new分配 memory 失敗時會拋出bad_alloc異常。

經典的 C malloc()通過返回NULL指針來表示問題,但在 C++ 中, new運算符會引發異常。 然后,您可以捕獲異常:

try {
    int * bigArray = new int[1024*1024*1024] ;
}
catch (bad_alloc& ex) { 
    cout<<"bad_alloc :"<<ex.what()<<endl ;
}

請注意,您可以使用特殊版本的new ,它不會引發異常,但會在出現錯誤時返回NULL指針。 您可以通過調用new (nothrow)而不是new來使用它

雖然要求 4 gigs 的 memory 很可能會導致可捕獲的 std::bad_alloc 異常,但捕獲 bad_alloc 通常有點冒險。

try {
  char * one_byte = new char(42);
}
catch (std::bad_alloc & except) {
  // Doing anything but calling exit here will almost certainly fail.
}

暫無
暫無

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

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