C++:抛出异常,是否使用"new"?
C++: Throwing exceptions, use 'new' or not?
使用throw new FoobarException(Baz argument);
或throw FoobarException(Baz argument);
合适吗?
在捕捉时,我总是使用catch(FoobarException& e)
"以防万一",但我从来没有找到一个可靠的答案,无论我是否必须在c++中使用new(绝对是Java),或者它只是程序员的偏好。
c++中的异常应该按值抛出,并通过引用捕获。
所以这是正确的方法:
try
{
throw FoobarException(argument);
}
catch( const FoobarException &ex )
{
cout << ex.what() << endl;
}
不要抛出用new创建的异常,因为谁负责删除它是没有定义好的。此外,在错误处理期间执行分配可能会抛出另一个异常,从而掩盖原来的问题。
你不必通过const引用来捕获(非const也可以),但我喜欢这样做。但是,您应该始终通过引用(而不是通过值)以多态方式捕获异常。如果不这样做,则异常的类型可以被分割。
除非有特殊要求,否则我总是按值抛出,按const
引用捕获。这是因为new
本身也可能抛出异常,在错误处理期间,最好避免可能导致异常的事情。
相关文章:
- 是否可以使用 new 指定具有宏常量的动态分配数组的元素?
- 传递给放置 new 的指针是否是指向其对象表示形式的非 UB 指针?
- "new"创建的实例的所有成员变量是否都存在于堆上而不是堆栈上?
- 在执行new期间是否可以在构造函数中传递不同的参数?
- 在C++"new"运算符之后使用"realloc"是否安全?
- 在 new 关键字中,由默认构造函数初始化的类中的元素是否也使用 new 关键字在C++?
- 如果我为一个类编写new和delete运算符,我是否必须编写它们的所有重载
- 编译器是否在由 new 初始化的对象上调用隐式析构函数
- "new"运算符是否总是调用构造函数?
- 使用运营商New分配的数据结构是否有任何副作用
- 供应商是否将 new 和 malloc 实现为小型对象分配器
- 函数是否应返回"new"对象
- c++ 运算符 new[]/delete [] 是否调用运算符 new/delete?
- 以下代码中的嵌入"new"是否会导致内存泄漏?
- new[] 是否初始化内置数组
- 在不先显式调用析构函数的情况下,在旧对象上使用placement new是否危险
- 将函数放在类中,然后声明"New"是否使其线程安全?
- ' operator new '是否是c++核心语言的一部分?
- C++ 构造函数/析构函数调用 &对动态创建的数据调用"new"是否会删除旧数据?
- 放置"new"是否可以用于更改"const"数据?