为什么智能指针模板需要在构造函数中禁用异常引发

Why smart pointer templates need to disable exception throwing in constructor

本文关键字:异常 构造函数 指针 智能 为什么      更新时间:2023-10-16

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