Effective C++条款8,9析构中的异常和虚拟函数



条款8:别让异常逃离析构函数

析构函数的作用就是清理资源等后续工作,一旦这里发生异常就会产生严重后果。所以在编写析构函数时要格外小心。

class Widget{
public:
...
~Widget(){...}
};
void doSomething()
{
std::vector<Widget> v;
...
}

注:vector是STL内的东东,类似于数组,不过更加强大。

那么vector v被销毁时,里面的多个Widget对象也要被销毁。会多次调用~Widget(),如果一旦有连续~Widget()发生异常,那么后续的Widget就会发生内存泄露。所以针对析构函数的设计要小心。那么处理异常我第一个想到的方法就是 try catch。在析构函数本体内利用try catch 语句处理异常,还要注意析构函数内的复旦不要过大,减少发生异常概率,做到以上两点就可以尽量避免以上问题。

条款9:绝不在构造和析构过程中调用virtual函数

这个很奇怪,反正在见到这句话之前,我还真没想过这么做(因为没有见到过,不敢用)。如下

class Transaction{
public:
Transaction();
virtual void logTransaction() const=0;
....
};

尽管我没这么做过,很多人都没这么做过,但是不排除以下可能性的发生

class Transaction{
public:
Transaction()
{init();}
virtual void logTransaction() const=0;
...
private:
void init()
{
...
logTransaction();
}
};


以上两种行为都是不允许的。为何?

若有子类,且构造对象

class BuyTransaction:public Transaction{
public:
virtual void logTransaction() const;
... 
};
BuyTransaction b;

那么我们知道在子类的构造期间的顺序是先构造基类部分(即调用基类构造函数)然后再构造子类。在构造基类时,基类构造函数中的虚拟函数就会运行,并且其还是基类版本。为什么呢?因为在构造基类时,子类的的特有成员还都不存在,此时logTransaction()必定是基类版本。由于纯虚函数,必定会发生错误。即使不是pure virtual,那也可能违背了使用者的原意。同理析构函数析构顺序相反,但结果也是这样。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《Effective C++ 文第三版》是针对C++程序设计语言的一本重要的专业书籍,它将C++语言的各种语法特性、设计模式及编程技巧进行了深度分析和系统总结。 本书分为55条编程指南,从C++语言的核心概念(如RAII、异常安全等)到编程技巧的细节(如拷贝控制、继承、模板等)都进行了详细介绍。每个指南都包含了对应的问题、建议和说明,通过实际例子和对比分析,让读者能够更好地理解和掌握相关知识。 相比其他的C++规范书籍,《Effective C++ 文第三版》更加实用和直观,它的重点在于介绍如何写出正确、高效、健壮的C++代码。同时,书还对C++11和C++14的新特性进行了简单介绍,为读者扩展了视野,帮助读者更好地应对日益复杂的编程需求。 总的来说,《Effective C++ 文第三版》是一本适合C++程序员的入门和进阶教材,通过系统性的介绍和实例讲解,能够帮助读者逐步掌握C++语言的精髓和技巧,写出更加高效、健壮和易维护的程序。 ### 回答2: 《Effective C++ 文第三版》是一本介绍C++编程技巧的经典书籍。该书作者Scott Meyers是一位C++专家,他精心编写了该书的内容,用通俗易懂的语言阐述了C++编程的许多细节问题。通过学习这本书,读者可以更好地理解C++的语言特性,掌握C++编程的技巧和方法,以提高程序的质量和效率。 该书涵盖了37个条款,主要分为四个部分。第一部分介绍了C++语言的基础知识,包括构造函数和析构函数、赋值操作、拷贝构造函数等;第二部分介绍了C++的设计和实现,包括类设计、模板使用和异常处理等;第三部分介绍了C++的继承和多态,包括虚函数、抽象类、多重继承、虚继承等;第四部分介绍了C++的高级语言特性,包括模板元编程、异常安全、性能优化和智能指针等。 通过学习这本书,读者可以获得以下几个方面的收获。首先,掌握C++编程的基本技能和知识,能够写出高质量的、健壮的C++程序;其次,了解C++语言的设计和实现原理,能够更好地理解C++程序的内部机制;最后,学会了高效的C++编程技巧和方法,可以提高程序的性能和效率,避免常见的、容易犯的C++编程错误。 总之,《Effective C++ 文第三版》是一本非常优秀的C++编程书籍,对于想要成为一名优秀的C++程序员的读者来说,是一本不可多得的好书。 ### 回答3: Effective C++是一本非常经典的C++编程技巧指南,被誉为C++编程者必读的参考书之一。作者Scott Meyers深入浅出的将自己多年的实际经验和对C++各个方面的深入理解融合到了书,为读者提供了各种实用技巧和解决方案。本书被分成了50个小节,每个小节都介绍一个C++编程的技巧,如何避免陷阱以及如何让代码更加清晰可读。 Effective C++文第三版在前两版的基础上做了一些更新和补充,和当前主流的C++版本兼容,增加了对多线程编程方面的内容和对垃圾回收的讲解等等。此外,本书还提供了大量的实际例子和细节解释,让读者能够更好地理解和运用这些技巧。不仅适合初学者,对于已经上手C++编程的程序员也是一本非常有价值的参考书,可以帮助他们更好的掌握C++语言,并写出高效、可维护的代码。 总的来说,Effective C++C++编程界的经典书籍之一,具有极高的实用价值和指导意义。不同阶段的程序员都可以从获益,提高自己的编程能力。因此,对于想要成为一名优秀的C++程序员的人来说,这本书是绝不能缺少的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值