#include<iostream>
class Base1
{
public:
virtual ~Base1(){}
};
class Base2
{
public:
virtual void f()=0;
// virtual ~Base2(){};
};
class Derive:public Base1,public Base2
{
public:
void f(){std::cout<<"f\n";}
~Derive(){std::cout<<"Derive dtor\n";}
};
void func(Base2* p)
{
p->f();
}
int main(int , char**)
{
Derive *p = new Derive;
Base1 *pb1=p;
Base2 *pb2=p;
func(p);
delete p;
//delete pb1;
//delete pb2;
}
此代码通过修改base2的虚dtor 和 main中的delete pb2 ,会导致crash。
所谓的delete分为两步,runtime在遇到一个delete的时候,理论上会调用一个叫做delete
operator的东西,这个东西会先调用dtor,然后调用operator delete来释放内存。我们能够重载的是operator
delete,而delete operator是无法重载的。对于operator
delete来说,它接受一个void*为参数,它只负责释放内存。那么,按照你的layout,pb1和d指向的内存地址肯定是不一样的,由于
Base1有大小,pb2会有一个偏移。因此,对于operator delete来说,如果你传给它pb2,它就直接over了。那么,delete operator怎么可以知道应该怎样传递正确地传递地址过去呢?这是因为,delete
operator有点类似于virtual的。要实现这个virtual特性的先决条件就是,你的dtor必须是virtual的。这就可以解释为什么你
把virtual注释了,就会over。
static void* operator new(size_t size){
void* p=::operator new(size);
std::cout<<"Base2 new: "<<std::hex<<p<<"\n";
return p;
}
static void operator delete(void* p){
std::cout<<"Base2 del: "<<std::hex<<p<<"\n";
::operator delete(p);
}
可以打印指针指向的内存,可以看到,pb1和pb2和p指向是不一样的。要注意程序走进哪个operator delete。相关资料详见
effective c++ 7
分享到:
相关推荐
主要介绍了js中的内部属性与delete操作符的相关资料,需要的朋友可以参考下
动态内存分配操作符new和delete,以及new[]和delete[]
主要介绍了Javascript中的delete操作符详细介绍,着重介绍了哪些情况可以使用delete操作符,以有delete操作符的返回值等问题,需要的朋友可以参考下
new、delete(new[]、delete[])操作符的重载需要注意: 1.重载的 new、delete(或者 new[]、delete[])操作符必须是类的静态成员函数(为什么必须是静态成员函数,这很好理解,因为 new 操作符被调用的时候,对象还...
1、实现上delete操作符会调用引擎内部的[[Delete]]方法 2、[[Delete]]在8.6.2里定义 3、删除的属性有个DontDelete的特性,如果有,delete时直接返回false 搜索“DontDelete”,会发现有很多,如下都不能delete 1, ...
今天在看prototype代码时发现了delete这个操作符 代码如下:unset: function(key) { var value = this._object[key]; delete this._object[key]; return value; } 查了一下手册, delete 运算符 从对象中删除一个属性...
主要介绍了JavaScript中诡异的delete操作符,本文讲解了删除对象的属性、对数组的操作、对于变量的操作等内容,需要的朋友可以参考下
主要介绍了C++之CNoTrackObject类和new delete操作符的重载实例,是C++程序设计中比较重要的概念,需要的朋友可以参考下
1.delete操作符 delete 操作符用于删除对象的某个属性;如果没有指向这个属性的引用,那它最终会被释放 语法:delete expression delete 操作符会从某个对象上移除指定属性。成功删除的时候回返回 true,否则返回 ...
c++中new和delete运算符是用于动态分配和撤销内存的运算符,下面是示例,大家参考使用吧
在本篇文章里小编给大家分享的是关于JS中delete运算符的基础知识点,有需要的朋友们跟着学习下。
如果对象是通过new操作符创建的,则通过delete操作符调用析构函数。 复制构造函数: 形如foo_t(const foo_t& foo),以下情况复制构造函数均会被调用: 当对象按值返回时候(returned by value) 调用按值传参的函数...