Effective C++(7) 为多态基类声明virtual析构函数 or Not
已经对一个对象执行了delete语句,还会发生内存泄漏吗?
// 计时器类
class TimeKeeper {
public:
TimeKeeper();
~TimeKeeper();
};
class AtomicClock: public TimeKeeper { ...... }; // 原子钟
class WaterClock: public TimeKeeper { ...... }; // 水表
class WristWatch: public TimeKeeper { ...... }; // 腕表 // 设计工厂函数以供用户使用
TimeKeeper* ptk = getTimeKeeper(); // Factory函数会“返回一个父类的指针,指向新生成的子类对象”
......
delete ptk; // Point! 释放它,避免资源泄漏
class TimeKeeper {
public:
TimeKeeper();
virtual ~TimeKeeper();
......
};
// 使用
TimeKeeper* ptk = getTimeKeeper();
....
delete ptk;
class Point {
public:
Point(int xCoord, int yCoord);
~Point();
private:
int x, y;
};
如果int占用32bits,那么Point对象可塞入一个64bit缓存器中。这样一个Point对象可被当作一个“64bit量”传给以其他语言如C或Fortran撰写的函数。
class SpecialString: public std::string {
......
};
// 如果你有一段代码这样写,绝对是你悲剧的开始
SpecialString* pss = new SpecialString("Hello world!");
std::string* ps;
......
ps = pss;
......
delete ps; // 局部销毁,发生了资源泄漏
class AWOV {
public:
virtual ~AWOV() = 0;
};
AWOV::~AWOV() {} //纯虚函数的定义
这里有一个需要注意的地方是,这个析构函数的定义是必须的,不然编译器会报错。(因为编译不会再为你默默的生成一个了)
- 带有多态性质的父类应该声明一个virtual析构函数,如果class带有任何virtual函数,它就应该拥有一个virtual析构函数。
- 如果一个类的不是设计为一个父类来使用,或不是为了具备多态性,就不应该声明virtual析构函数,当然,不要有继承它的类出现。
Effective C++(7) 为多态基类声明virtual析构函数 or Not的更多相关文章
- [Effective C++ --007]为多态基类声明virtual析构函数
引言: 我们都知道类的一个很明显的特性是多态,比如我们声明一个水果的基类: class Fruit { public: Fruit() {}; ~Fruit(){}; } 那么我们根据这个Fruit基 ...
- 为多态基类声明virtual析构函数
一个函数的返回值为基类指针,而当指针指向一个派生类对象,接下来派生类对象被这个基类指针删除的时候,就出现了局部销毁的问题.因为C++指出,当派生类经由一个基类指针被删除,而该基类指针带着一个non-v ...
- effective c++(07)之为多态基类声明virtual析构函数
class TimeKeeper { public: TimeKeeper() ; ~TimeKepper() ; ... } ; class AtomicClock:public TimeKeepe ...
- Effective C++_笔记_条款07_为多态基类声明virtual析构函数
(整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 这个规则只适用于polymorphic(带多态性质的)base ...
- Effective C++ -----条款07:为多态基类声明virtual析构函数
polymorphic(带多态性质的)base classes应该声明一个virtual析构函数.如果class带有任何virtual函数,它就应该拥有一个virtual析构函数. Classes的设 ...
- 【C++】为多态基类声明virtual析构函数
来自<Effective C++>条款07:为多态声明virtual析构函数 当derived class对象经由一个base class指针被删除,而该base class带着一个non ...
- 条款7:为多态基类声明virtual析构函数
C++明确指出:当派生类对象是由一个基类指针释放的,而基类中的析构函数不是虚函数,那么结果是未定义的.其实我们执行时其结果就是:只调用最上层基类的析构函数,派生类及其中间基类的析构函数得不到调用. # ...
- NO.6: 为多态基类声明virtual析构函数
注意:polymorphic base class 应该具有虚析构函数,如果class带有任何virtual函数,也应具有虚析构函数 class不具备polymorphic属性则不应该声明virtua ...
- Effective C++学习笔记 条款07:为多态基类声明virtual析构函数
一.C++明确指出:当derived class对象经由一个base class指针被删除,而该base class带着一个non-virtual析构函数,其结果未定义——实际执行时通常发生的是对象的 ...
随机推荐
- Linux C笔记
<Linux C编程一站式学习>笔记 gcc编译 直接编译 gcc main.c a.out 指定可执行文件名 gcc main.c -o main main 提示所有的警告信息 gcc ...
- StackMapTable属性说明
(1)StackMapTable属性的说明 https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.7.4 (2)S ...
- Manjaro解决 Node.JS Error: ENOSPC
https://github.com/guard/listen/wiki/Increasing-the-amount-of-inotify-watchers#the-technical-details ...
- 部署rails遇到问题
underfined method for has_attched_file when installing paperclip 解决 create the file paperclip.rb ins ...
- 设计模式--策略模式(strategy)
1.策略模式(strategy ['strætədʒi]) 我的理解是:方案候选模式 (反正关键就是有很多的候选,哈哈) 看了很多例子,都是在说鸭子的,那个例子很好,在这里可以看 他们生产鸭子,我们就 ...
- SQL常用性能相关脚本
--调试语句性能前记得清空执行计划 每次执行需优化SQL前,带上清除缓存的设置SQL. 平常在进行SQL Server性能优化时,为了确保真实还原性能问题,我们需要关闭SQL Server自身的执行计 ...
- [PY3]——IO——文件读写
文件打开和关闭 # 使用open 打开文件,返回时值是一个 File-like对象 f.open('/test/file') # 使用read读取文件 f.read( ) # 使用close关闭文件 ...
- IOS仿微信朋友圈好友展示
前几天小伙伴要帮他做一个群聊功能,里面有好友列表,要求和微信的差不多(见下图),让小伙伴自己实现了下,他将CollectionView放在tableView的tableHead中,可是当添加好友或删除 ...
- Java CountDownLatch解析(下)
写在前面的话 在上一篇CountDownLatch解析中,我们了解了CountDownLatch的简介.CountDownLatch实用场景.CountDownLatch实现原理中的await()方法 ...
- P1025[SCOI2009]游戏
windy学会了一种游戏.对于1到N这N个数字,都有唯一且不同的1到N的数字与之对应.最开始windy把数字按 顺序1,2,3,……,N写一排在纸上.然后再在这一排下面写上它们对应的数字.然后又在新的 ...