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

时间:2016-02-10 16:04:56

标签: c++ templates smart-pointers

我在阅读C ++ primer plus中的智能指针模板类时发现了这样的问题。 本书给出了如何实现 auto_ptr 类的示例,如下所示,

template<class X> class auto_ptr {
public:
    explicit auto_ptr(X* p = 0) throw();
...};

构造函数末尾的throw()意味着此构造函数不会抛出异常。 我知道这已被弃用,但我不知道为什么它需要禁用它的异常抛出。

3 个答案:

答案 0 :(得分:5)

throw()不会禁用异常抛出。它只是说该函数不会抛出任何异常。这是关于构造函数中的代码的声明:那里没有什么会抛出一个从构造函数中逃脱的异常。这意味着构造函数中的代码不会抛出任何异常(例如,int i = 3;不会抛出异常),或者抛出异常的任何内容都包含在trycatch条款不会抛出任何内容的块。

答案 1 :(得分:3)

因为如果auto_ptr的构造函数会抛出异常,指针可能会丢失然后导致内存泄漏。例如:

auto_ptr<int> ap(new int);

如果构造函数失败,则无法再次释放已分配的内存。

答案 2 :(得分:0)

他们声明一个意图/承诺不会抛出异常 - 他们仍然可以,但如果他们这样做,将被运行时严格打乱。 使用noexcept over throw()的原因主要是学术上的。