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

输出

new和delete的动态分配。的更多相关文章

  1. 位运算+引用+const+new/delete+内联函数、函数重载、函数缺省参数

    update 2014-05-17 一.位运算 应用: 1.判断某一位是否为1 2.只改变其中某一位,而保持其它位都不变 位运算操作: 1.& 按位与(双目): 将某变量中的某些位(与0位与) ...

  2. C++面试题汇集

    1.在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?答:首先,extern是C/C++语言中表明函数和全局变量作用范围的关键字,该关键字告诉编译器,其声明的函数和变量可以 ...

  3. C++ 系列:C++ 基础 001

    Copyright © 1900-2016, NORYES, All Rights Reserved. http://www.cnblogs.com/noryes/ 欢迎转载,请保留此版权声明. -- ...

  4. C++程序设计(一)

    1. 函数指针 程序运行期间,每个函数都会占用一段连续的内存空间.而函数名就是该函数所占内存区域的起始地址(也称"入口地址").我们可以将函数的入口地址赋给一个指针变量,使该指针变 ...

  5. 深入理解C语言中的指针与数组之指针篇

    转载于http://blog.csdn.net/hinyunsin/article/details/6662851     前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本 ...

  6. C++程序结构---1

    C++ 基础教程Beta 版 原作:Juan Soulié 翻译:Jing Xu (aqua) 英文原版 本教程根据Juan Soulie的英文版C++教程翻译并改编. 本版为最新校对版,尚未定稿.如 ...

  7. C++重要知识点小结---3

    C++重要知识点小结---1:http://www.cnblogs.com/heyonggang/p/3246631.html C++重要知识点小结---2:http://www.cnblogs.co ...

  8. effective c++:资源管理

    对象管理资源 createInvestment 函数作用时创建一个invest对象: void f() { Investment *pInv = createInvestment(); // call ...

  9. 深入理解C语言中的指针与数组之指针篇(转载)

    前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本所在.相信,任意一家公司如果想要考察一个人对C语言的理解,指针和数组绝对是必考的一部分. 但是之前一方面之前一直在忙各种事情 ...

随机推荐

  1. SAP中对于获取订单的状态

    在SAP中对于如何获取订单的状态,提供了至少两个函数,分别是 STATUS_READ 和   STATUS_TEXT_EDIT.下面简单介绍这两个函数 1.STATUS_READ  改函数的实现原理大 ...

  2. ios 适配问题

    两张图解决

  3. MySQL注释符号

    今天在执行mysql语句时很奇怪为什么没有执行,查询后发现“-- ”是mysql的注释符号,不会执行的  mysql注释符有三种: 1.#... 2."-- ",注意--后面有一个 ...

  4. 运用html常用标签和css定位等学做模仿百度导航页面

    导航部分文字链接,鼠标触碰变颜色,除百度logo引用图片外,其它均代码编写.注释部分是一开始用的百度一下截图做的按钮,后来用div填充颜色写了一个按钮.效果图如下. HTML代码如下: <!DO ...

  5. Codeforces 1105D(双层广搜)

    要点 题意:可以拐弯,即哈密顿距离 注意不可以直接一个一个搜,这过程中会把下一轮的标记上,导致同一轮的其它点没能正常完成应有的搜索 因此采用双层广搜,把同一轮先都出队列再的一起搜 #include & ...

  6. Uva11572

    读入可以不需要存入数组 #include<bits/stdc++.h> #define inf 0x3f3f3f3f //const int maxn=; using namespace ...

  7. 《java学习三》jvm性能优化------jconsul

    利用jconsul检测线程死锁,    死锁的线程,会有   已锁定    三个字 visualVm                       也在jdk里 VisualVM 是一款免费的,集成了多 ...

  8. Bootcamp Win10蓝牙鼠标的问题

    运行services.msc找到Bluetooth support service 把启动类型从手动改为自动 重新连接蓝牙鼠标

  9. swift 监听键盘弹出的高度

    // 监听键盘通知 NotificationCenter.default.addObserver(self, selector: #selector(ComposeViewController.key ...

  10. HDU 3530Subsequence(单调队列)

    题意 题目链接 给出$n$个数,找出最长的区间,使得区间中最大数$-$最小数 $>= m$ 且$<= k$ Sol 考虑维护两个单调队列. 一个维护$1 - i$的最大值,一个维护$1 - ...