new和delete的动态分配。

c++对象模型 视频的实际操作

 note:
1.虚函数有虚指针,所以是4,不管有几个虚函数,
都只有一个vptr来存放调用的虚函数的地址。
2.子类的内存是父类内存的加自己的数据内存。
3.class类型的动态数组的初始化调用类的默认构造函数。
4.sizeof(Foo[5])=5*sizeof(Foo) array前面多了一个count,编译器才知道要调几个构造和析构。
 

// test4.cpp : 定义控制台应用程序的入口点。
//

#include <iostream>
using namespace std;

 

class Foo
{
public:
	int id;//4
	long data;//4
	string str;//32

public:
	Foo():id(0)
	{
		cout<<"default ctor.this="<<this<<",id="<<this->id<<endl;
	}
	Foo(int i):id(i)
	{
		cout<<"ctor.this="<<this<<",id="<<id<<endl;
	}

	//virtual
	~Foo() {cout<<"dtor.this="<<this<<",id="<<id<<endl;}

	static void* operator new(size_t size);
	static void operator delete(void* phead,size_t size);
	static void* operator new[](size_t size);
	static void operator delete[](void* phead,size_t size);
};

void* Foo::operator new(size_t size){//size=40
	Foo* p=(Foo*)malloc(size);
	cout<<"Foo::operator new(size_t size) "<<size<<endl;
	return p;
}

void Foo::operator delete(void* phead,size_t size){
	cout<<"Foo::operator delete(void* phead,size_t size)) "<<phead<<","<<size<<endl;
	free(phead);
}

void* Foo::operator new[](size_t size){
	Foo* p=(Foo*)malloc(size);
	cout<<"Foo::operator new[](size_t size) "<<size<<endl;//size=40*5+4=204,4字节用来存放指针,指针里的内容是数组的长度
	return p;
}

void Foo::operator delete[](void* phead,size_t size){
	cout<<"Foo::operator delete[](void* phead,size_t size)) "<<phead<<","<<size<<endl;
	free(phead);
}

int main()
{
	 
	cout<<sizeof(Foo)<<endl;//40
	Foo* p=new Foo(7);// 先operator new(sizeof(Foo))分配40个字节,再调构造函数 
	cout<<endl;
	delete p;//先调初始化为7的析构函数,再调operator delete(p,sizeof(Foo))释放40个字节
	cout<<endl;
	//cout<<sizeof(Foo[])<<endl; //非法
	cout<<sizeof(Foo[5])<<endl; //40*5=200
	Foo* pArray=new Foo[5]; // 先operator new(sizeof(Foo[5])+sizeof(Foo*))分配204个字节, 再调5个默认构造函数
	cout<<endl;
	delete[] pArray;//先调最后一个构造的数组元素,最后释放存放Foo的指针,size=40
	cout<<endl;
	cout<<endl;

	//////////////::new Foo(7)全局动态分配 跳过前面的重载
	//Foo* p=::new Foo(7);//“p”: 重定义;多次初始化  
	Foo* p2=::new Foo(7);
	cout<<endl;
	::delete p;
	cout<<endl;
	//Foo* pArray=::new Foo[5]; // “pArray”: 重定义;多次初始化 
	Foo* pArray2=::new Foo[5];
	cout<<endl;
	::delete[] pArray;

	system("pause");
	return 0;
}

输出

posted @ 2018-08-10 18:39  lightmare  阅读(243)  评论(0编辑  收藏  举报