zoukankan      html  css  js  c++  java
  • 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;
    }

    输出

  • 相关阅读:
    【洛谷】P1303 A*B Problem(高精度乘法模板)
    快速幂
    【洛谷】P1601 A+B Problem 高精(高精度加法模板)
    进制转换
    【洛谷】P1551 亲戚(并查集模板)
    求最大公约数的两种方法
    快速排序
    异或交换两个数
    数字字符串互相转换的三种方法
    Hello world(我来啦)
  • 原文地址:https://www.cnblogs.com/lightmare/p/10398813.html
Copyright © 2011-2022 走看看