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;
    }

    输出

  • 相关阅读:
    IDEA手动创建JFinal项目(404问题处理)
    php 把数字1-1亿换成汉字表述,例如 150 转成 一百五十
    模仿console自写函数打印js的对象
    每瓶啤酒2元,2个空酒瓶或4个瓶盖可换1瓶啤酒。10元最多可喝多少瓶啤酒? php
    js-Event构造函数,也许你需要
    js将金额专成每隔3位数加逗号
    js-PC版监听键盘大小写事件
    用php脚本给html中引用的js和css路径打上版本
    通过js的console优雅的将php调试信息输出
    android中加载的html获取的宽高不正确
  • 原文地址:https://www.cnblogs.com/lightmare/p/10398813.html
Copyright © 2011-2022 走看看