微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C ++,标准库异常

如何解决C ++,标准库异常

| 在C ++中,\“ new.h \”定义了以下类
class bad_alloc : public exception 
{
   public:
        bad_alloc() throw() { }
        virtual ~bad_alloc() throw();
};
构造函数和析构函数都被明确指定为不引发异常,它没有其他成员函数,但是它继承了“ exception \”类。 我的假设是\“ new \”运算符使用该类在分配期间发生错误时引发异常。但是如何?没有有效的成员函数,如何在代码中实际使用它? 我想知道,此类“ bad_alloc \”声明的用途是什么?请帮我。     

解决方法

        不需要成员函数-这是完全有效的:
throw 42;
大多数情况下,我们对异常的类型感兴趣,而对异常没有太多兴趣。但是,标准异常的确从异常基类继承了某些功能。     ,        异常并不需要成员。您声明类,以便可以显式捕获它们:
try {
    Foo * foo = new Foo();
}
catch(std::bad_alloc &) {
    std::cout << \"could not allocate\" << std::endl;
}
类型的名称是所有必需的信息。上面的语句仅捕获
bad_alloc
及其所有子类。     ,        有效的成员函数继承自
exception
bad_alloc
的目的是当您寻找
runtime_error
logic_error
时不会被抓住。     ,           没有有效的成员函数,如何在代码中实际使用它? 此类的目的仅是向(
new
的调用者)发信号通知失败的分配(=缺少可用内存)。它不需要任何成员函数。     ,        这是新操作员的代码。没什么特别的。它只是抛出此类的一个实例。
#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);
        }
    ,        创建该类的对象,然后将其抛出:“ 10”。 本质上,您可以抛出任何对象或值。然后可以在
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
}
您也可以忽略此类,而只抛出字符串(抛出\“ Error发生了错误!\”),但是您无法区分它们,因此您要么处理所有字符串要么都不处理。     ,        当某些例程无法分配内存时,会抛出异常。如果您要发信号通知这样的情况,可以这样使用:
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...
}
    ,        当
new
无法分配内存时,将抛出
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兆的内存很可能会导致可捕获的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.
}
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。