为什么智能指针模板需要在构造函数中禁用异常引发
Why smart pointer templates need to disable exception throwing in constructor
我在阅读入门加号中的智能指针模板类时发现了这样的问题C++。这本书给出了一个auto_ptr类是如何实现的例子,就像这样,
template<class X> class auto_ptr {
public:
explicit auto_ptr(X* p = 0) throw();
...};
构造函数末尾的 throw() 意味着此构造函数不会抛出异常。我知道这已被弃用,但我不知道为什么它需要禁用其异常抛出。
throw()
不会禁用异常引发。它只是说该函数不会引发任何异常。这是关于构造函数中代码的声明:没有任何内容会引发从构造函数中转义的异常。这意味着构造函数中的代码不会引发任何异常(例如,int i = 3;
不会引发异常),或者任何引发异常的内容都包含在try
块中,catch
子句不会引发任何内容。
因为如果auto_ptr
的构造函数会引发异常,指针可能会丢失,然后导致内存泄漏。例如:
auto_ptr<int> ap(new int);
如果构造函数失败,则无法再次释放分配的内存。
他们声明了一个不抛出异常的意图/承诺 - 他们仍然可以,但如果他们这样做,就会被运行时狠狠地打击。使用 noexcept over throw() 的原因主要是学术性的。
相关文章:
- 从构造函数抛出异常时如何克服内存泄漏
- 如何编写带有异常的构造函数
- 从 C++ 中异常的构造函数引发异常
- 我正在尝试创建一个使用 c++ 中的参数包构造函数的异常类
- 稍后在构造函数中重新启动异常指令删除此指令
- 自定义异常中的用户定义的空构造函数,具有多个继承和抽象基类
- 构造函数中引发的异常
- 如何捕获源自静态分配对象的构造函数的异常?
- 从构造函数内存泄漏引发异常
- C++:如何捕获构造函数引发的异常?
- std::vector::emplace() 真的在面对抛出移动构造函数/赋值运算符时提供了强大的异常保证吗?
- V8 - 节点C++插件 - 在构造函数中引发异常会导致"致命错误:v8::ToLocalChecked Em
- 为什么要抛出引用调用复制构造函数的异常?
- std::vector 默认构造函数可以抛出异常吗?
- 如何防止构造函数在引发异常时创建对象
- 当构造函数的参数类型错误时引发异常
- 异常构造函数中的例外
- C++11 引入了采用 'const char*' 的异常构造函数.但是为什么
- 在异常构造函数中参数化错误消息是一种好的做法吗
- 异常构造函数来填充字符串流