在C ++中,“new.h”下面的类定义了
class bad_alloc : public exception
{
public:
bad_alloc() throw() { }
virtual ~bad_alloc() throw();
};
两个构造函数和析构函数都明确指定为不抛出异常,它没有其他成员函数,但它继承了“异常”类。
我的假设是“new”运算符在分配期间发生错误时使用此类来抛出异常。但是怎么样?没有有效的成员函数,它是如何在代码中实际使用的?
我想知道,这个类“bad_alloc”声明的用法是什么?请帮帮我。
答案 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)
有效的成员函数继承自exception
。 bad_alloc
的目的是,当您在寻找runtime_error
或logic_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.
}