码迷,mamicode.com
首页 > 编程语言 > 详细

C++:标准string或者STL容器不含virtual析构函数,所以不应该被继承——摘自Effective C++中文版第三版P42

时间:2019-10-14 10:24:38      阅读:86      评论:0      收藏:0      [点我收藏+]

标签:stl容器   机制   调用   col   base   应该   list   spec   rtu   

即使class完全不带virtual函数,被“non-virtual析构函数问题”给咬伤还是有可能的。举个例子,标准string不含任何virtual函数,但有时候程序员会错误的把它当做base class:

1 // 馊主意,std::string有个non-virtual析构函数
2 class SpecialString: public std::string{
3     ...
4 };

乍看似乎无害,但如果你在程序任意某处无意间将一个pointer to SpecialString转换成一个pointer to string,然后将转换所得的那个string指针delete掉,你立刻被流放到“行为不明确”的恶地上。

 1 SpecialString* pss = new SpecialString("Impending Doom");
 2 std::string* ps;
 3 ...
 4 
 5 // SpecialString* => std::string*
 6 ps = pss;
 7 ...
 8 
 9 // 未有定义,现实中*ps的SpecialString资源会泄露,
10 // 因为SpecialString的析构函数没被调用
11 delete ps;

相同的分析适用于任何不带virtual析构函数的class,包括所有STL容器,如vectorlistsettr1::unordered_map等等。如果你曾经企图继承一个标准容器或任何其他“带有non-virtual析构函数”的class,拒绝诱惑吧。(很不幸C++没有提供类似Java的final class或C#的sealed class那样的“禁止派生”机制)

C++:标准string或者STL容器不含virtual析构函数,所以不应该被继承——摘自Effective C++中文版第三版P42

标签:stl容器   机制   调用   col   base   应该   list   spec   rtu   

原文地址:https://www.cnblogs.com/pepetang/p/11669915.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!