C ++,标准库异常

时间:2011-05-30 13:41:39

标签: c++ exception

在C ++中,“new.h”下面的类定义了

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

两个构造函数和析构函数都明确指定为不抛出异常,它没有其他成员函数,但它继承了“异常”类。

我的假设是“new”运算符在分配期间发生错误时使用此类来抛出异常。但是怎么样?没有有效的成员函数,它是如何在代码中实际使用的?

我想知道,这个类“bad_alloc”声明的用法是什么?请帮帮我。

9 个答案:

答案 0 :(得分:2)

不需要会员功能 - 这完全有效:

throw 42;

大多数情况下,除了异常,我们对异常的类型感兴趣,而不是其他。但是,标准异常会从异常基类继承一些函数。

答案 1 :(得分:2)

例外并不需要成员。您声明了这些类,以便您可以显式地捕获它们:

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

该类型的名称是所需的全部信息。上述语句仅捕获bad_alloc及其所有子类。

答案 2 :(得分:1)

有效的成员函数继承自exceptionbad_alloc的目的是,当您在寻找runtime_errorlogic_error时,您无法抓住它。

答案 3 :(得分:1)

  

没有有效的成员函数,它是如何在代码中实际使用的?

此类的目的仅仅是向new的调用者发信号通知失败的分配(=缺少可用内存)。它不需要任何成员函数。

答案 4 :(得分:1)

创建并抛出类的对象:throw bad_alloc();。 基本上你可以抛出任何对象或值。然后可以在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
}

你也可以忽略这些类并抛出字符串(抛出“错误发生!”),但你无法区分它们,所以你要么处理所有字符串,要么不处理。

答案 5 :(得分:1)

这是新运营商的代码。没什么特别的。它只是抛出了这个类的一个实例。

#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);
        }

答案 6 :(得分:0)

在某些例程无法分配内存的情况下抛出异常。如果您想要发出这样的信号,就像这样使用:

throw std::bad_alloc();

另外,如果你想捕获内存分配错误,它会是这样的:

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

答案 7 :(得分:0)

bad_alloc无法分配内存时抛出new异常。

经典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

来使用它

答案 8 :(得分:0)

虽然要求4 gig的内存很可能会导致一个可捕获的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.
}