我在阅读入门加号中的智能指针模板类时发现了这样的问题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() 的原因主要是学术性的。