我在阅读C ++ primer plus中的智能指针模板类时发现了这样的问题。 本书给出了如何实现 auto_ptr 类的示例,如下所示,
template<class X> class auto_ptr {
public:
explicit auto_ptr(X* p = 0) throw();
...};
构造函数末尾的throw()意味着此构造函数不会抛出异常。 我知道这已被弃用,但我不知道为什么它需要禁用它的异常抛出。
答案 0 :(得分:5)
throw()
不会禁用异常抛出。它只是说该函数不会抛出任何异常。这是关于构造函数中的代码的声明:那里没有什么会抛出一个从构造函数中逃脱的异常。这意味着构造函数中的代码不会抛出任何异常(例如,int i = 3;
不会抛出异常),或者抛出异常的任何内容都包含在try
中catch
条款不会抛出任何内容的块。
答案 1 :(得分:3)
因为如果auto_ptr
的构造函数会抛出异常,指针可能会丢失然后导致内存泄漏。例如:
auto_ptr<int> ap(new int);
如果构造函数失败,则无法再次释放已分配的内存。
答案 2 :(得分:0)
他们声明一个意图/承诺不会抛出异常 - 他们仍然可以,但如果他们这样做,将被运行时严格打乱。 使用noexcept over throw()的原因主要是学术上的。