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. String,StringBuffer和StringBuilder

    String,StringBuffer和StringBuilder分别应该在什么情况下使用? String 是Java的字符串类,其实质上也是用Char类型存储的,但是除了hash属性,其他的属性都声 ...

  2. mac 增加/usr/bin目录的操作无权限

    起因:想要往/usr/bin目录下拷贝文件,提示: operation not permitted 解决办法: 1. 重启,启动中长安command+r进入恢复模式 2.顶部菜单拉中打开终端 3. 输 ...

  3. ES6新特性使用小结(四)

    十一.Proxy .Reflect ①.Proxy 的概念和常用方法 { let obj = { //1.定义原始数据对象 对用户不可见 time: '2017-09-20', name: 'net' ...

  4. Luogu P1462 通往奥格瑞玛的道路 二分答案+最短路

    先二分答案,再跑最短路,跑的时候遇到 过路费超过二分的答案的 就不拿他更新最短路 #include<cstdio> #include<iostream> #include< ...

  5. 从wireshake分析http和https的通信过程

    参考文章: Wireshark基本介绍和学习TCP三次握手 [技术流]Wireshark对HTTPS数据的解密 Wireshark/HTTPS Journey to HTTP/2 以TCP/IP协议为 ...

  6. 查询索引range失效

    在某一个时间字段加索引,短的时间范围内查询,索引生效,为range.长时间范围,索引失效,查全表. 当索引查的数据量超过全表30%的数据,索引失效,会查全表.

  7. CSS——制作天天生鲜主页

    终于做好了! index.html: <!DOCTYPE html> <html lang="en"> <head> <meta char ...

  8. Jexus~docker与它产生了暖味

    前段时间写了很多docker for .net core的文章,用来快速部署微服务相当给力,而尝到了香头的我们希望把.net frameworks的程序也使用docker来部署一下,那么接下来我就结果 ...

  9. StringMVC

    public class FirstController implements Controller { public ModelAndView handleRequest(HttpServletRe ...

  10. java学习笔记(3)——对象与类(日期)

    变量.类型.赋值.运算符等等: https://blog.csdn.net/common77zwq/article/details/81988676 1.概念: 面向对象程序设计OOP.类class. ...