[百度空间] [转+原]虚析构函数

析构函数何时该时虚拟的?
  当你可能通过基类指针删除派生类对象时。
  
  虚函数绑定到对象的类的代码,而不是指针/引用的类。如果基类有虚析构函数,delete basePtr时(译注:即基类指针),*basePtr 的对象类型的析构函数被调用,而不是该指针的类型的析构函数。这通常是一件好事情。

以上摘选自: http://blog.tianya.cn/blogger/post_show.asp?BlogID=75687&PostID=6299328
  
 VS2005测试:

class t0
{
int i0;
public:
t0() :i0(0) {}
/*virtual*/ ~t0() {}
};

class t1 :public t0
{
int i1;
public:
t1() :i1(0) {}
~t1() {}
static void* operator new(size_t size)
{
   return ::malloc(size);
}
static void delete(void*p)
{
   ::free(p);
}
};

int _tmain()
{
t0* pt0 = new t1;
delete pt0;
}

//当t0的析构声明为virtual时,delete所做的(正确工作)是:
//1.调用t1::~t1()
//2.调用t0::~t0()
//3.调用t1::operator delete

//对于上例中的情况:
//当t0的析构函数没有声明virtual时,delete operator做的工作就是
//1.只调用 t0::~t0()                           ****问题1
//2.调用::operator delete                  ****问题2

以前只是知道,没有virtual声明虚析构函数的时候,通过基类指针的析构会出现问题:只析构基类(问题1).
这里要注意,如果没有声明virtual,那么某些情况下,不仅仅是析构函数的调用有问题,operator delete也会出现问题.

另外经过测试,在导入了DLL的时候,在DLL中创建的类,在EXE中delete 它的(纯)虚基类指针,则EXE会自动找到DLL中该类的operator delete,和析构函数,即使operator delete和析构函数这两个接口在EXE中并没有暴露..OO果然很强大..(还是MSVC compiler强大....?)
但是,析构函数的调用还可以理解,因为虚指针中的vtable中有析构函数的指针,但是operator delete呢?莫非.....

嗯,dector和operator delete不管内部如何实现,或许对OO来说,要求都一样,都是OO的多态必须解决的问题...

时间: 2024-12-21 11:49:39

[百度空间] [转+原]虚析构函数的相关文章

C++:探究纯虚析构函数以及实现数组的快速排序与链表的归并排序

C++:探究纯虚析构函数以及实现数组的快速排序与链表的归并排序 by 小威威 1.介绍 本篇博文将通过课后作业的(15 C++ Homework) D&A 5 Collection with Inheritance来讲解一些重要的排序与零散的知识.而且,本人以科学严谨的态度,对抽象类中析构函数的调用情况进行了分类讨论并一一试验,最终得出了"抽象类最好要定义纯虚析构函数"的结论,并不是凭空捏造,或者是从网上拷贝而来.但是,这仍然代表本人观点,不具有权威性,如有错误,欢迎大家批评指

C++虚析构函数

在类中,构造函数用于初始化对象及相关操作,构造函数是不能声明为虚函数的,因为在执行构造函数前对象尚未完成创建,虚函数表尚不存在,此时就无法去查询虚函数表,因此也就无法得知该调用哪一个构造函数了. 析构函数则用于销毁对象时完成相应的资源释放工作,析构函数可以被声明为虚函数.我们先通过一个例子来说明析构函数声明为虚函数的必要性. 例1: #include<iostream>using namespace std; class base{public: base(); ~base();private

关于虚析构函数的作用和使用

作用:作为基类使用的类应该具有虚析构函数,以保证在删除基类指针(动态分配的对象)时.依据指针实际指向的对象进行适当的析构. 请看以下这段代码; #include <iostream> class A{ public: A(){ std::cout << "A constructor execute" << std::endl; } ~A(){ std::cout << "A destructor execute" &l

虚析构函数

简单来说析构函数就是回收站.若系统不及时去回收这些垃圾(通常是无用的内存资源),那么时间越久肯定会有越来越多的垃圾.在开相同的程序,有时候手机和电脑重启了一下,速度会明显变快很多.因为RAM中的资源掉电后就释放了. 在C++中,析构函数就是释放无用资源的.在派生类中,假设用基类指针指向了一个派生类的临时变量.那么会发生什么情况.实际上这个时候只会释放基类的无用资源而没有释放这个临时的派生类的资源. #include<iostream> usingnamespacestd; classPoint

C++ 类的多态四(虚析构函数的重要性)

//虚析构函数的重要性 #include<iostream> using namespace std; /* 虚析构函数 主要用在多态中,用来释放子类对象内存空间,如果不使用虚析构函数, 那么在多态的场景下,使用delete关键字只能执行父类析构函数 子类对象中没有父类对象 父类中有虚函数,子类中重写了该虚函数,那么默认子类中重写的函数也是虚函数,子类中不写也可以 但是为了代码的可读性,还是在子类中也加上virtual 关键字 */ class Point{ public: Point(int

虚函数与虚析构函数原理

----------------siwuxie095 关于虚函数和虚析构函数的实现原理,因为涉及到 函数指针, 所以先介绍什么是函数指针 函数指针 如果通过一个指针指向对象,就称其为 对象指针,指针除了可以 指向对象之外,也可以指向函数,就称其为 函数指针 函数的本质,其实就是一段二进制的代码,它写在内存中, 可以通过指针来指向这段代码的开头,计算机就会从开头 一直往下执行,直到函数的结尾,并通过指令返回回来 如果有这么 5 个函数指针,它们所存储的就是 5 个函数的函数地址,当 使用时,如:使

“百度空间关闭”后的问题解决攻略

4月7日消息,运营八年的百度空间今日宣布关闭,百度空间的内容将于5月7日正式迁移到百度云. 公告显示,从今年4月21日起,百度空间停止编撰更新博文,博文内容迁移后只对自己可见. 针对百度空间关闭的问题,多备份为您提供完整的解决攻略. 第一步:根据自身情况寻找一个主机商,购买虚拟主机; 第二步:进入多备份,联系客服索取博客快速建站脚本; 第三步:将快速建站脚本上传到虚拟主机的FTP中,然后用域名访问该文件,选择个人喜欢的博客程序,下载解压,然后访问域名安装.安装完成即可实现自建博客; 第四步:自建

为多态基类声明一个虚析构函数

使用一个基类指针删除派生类对象,同时基类的析构函数是非虚的,那么这个指针只会删除派生类对象中的基类的部分,其派生部分不会被删除.造成资源泄漏. 而如果一个类并不用作基类,则没必要把析构函数声明为虚的,否则会浪费空间来存储虚函数指针和虚函数表. STL容器并不含虚析构函数,因此最好不要继承STL容器. 只要有一个纯虚函数,就会导致抽象基类,即不能声明该基类的对象.抽象基类只能用来继承,纯虚函数如: virtual ~AWOV() = 0; 你必须为这个纯虚析构函数提供定义,因为析构函数调用时,最先

转自 x_x的百度空间

空华人生         by 淡漠的心情 昨天,又昨天. 今天,又今天. 明天,又明天. 日历渐渐稀薄,忽然发现,那是时间的痕迹. 似乎,总是在麻木的等待. 何时,才能历尽. 再算算,我又还有多少天能够挥霍. 上天,又还会给我多少天. 人生短暂. 日子,总有过完的一天. 而我,又能做些什么. 发呆?叹气?还是努力?深思着...... 或许,这些事.不该我烦吧.若烦,是自寻烦丝. 记得有句话说:要顺其自然,开心点. 呵,是这样吗? 仔细想想,又不对. 有些人,庸碌一生.满头白发后,再唏嘘的向后人