堆与栈

  • 是存在于某一作用域内的数据,在函数内声明的任何变量,其所使用的内存块都取自上述stack

  • 实在system heap,是由操作系统提供的一块global 内存空间,系统可动态分配其中的若干块,但是要

栈和堆

区别
删除方式 需要手动删除 当栈返回时会自动删除
  • static 对象

    起作用域结束之后仍然存在,直到整个程序结束

  • global 对象

    在任何{} 外,直到整个程序结束之后才结束,其作用域是整个程序,视为一种static object

new和delete

使用方式

1
2
3
4
String s= new Stirng("sss");
delete s;
int[] store=new int[8];
delete[] store;

背后实现

  • new
    1
    2
    3
    4
    Complex *pc;
    void* mem=operator new(sizeof(Complex));//malloc(n)
    pc = static_cast<Complex*>(mem);//转型
    pc->Complex::Complex(1,2);
  • delete
    1
    2
    3
    4
    5
    String* ps = new Sting("Hello");
    delete ps;

    String::~String(ps);
    operator delete(ps);

    malloc

    1
    malloc(sizeof(Complex));
vc 的分配举例
  • 通用

    • 4Byte *2

      cookie 头用于操作系统管理内存,上下各有一个所以*2
      
    • 实际数据内容

      Complex double 4Byte*2 两个double
      
  • debug 模式包含

    • 4Byte ,共有8个头
    • 4Byte ,一个用作尾
  • 总和

    • debug 42+48+4+3*2 = 52

      由于要求是16的倍数,要在调试信息结尾处补00,顾共占64个字节

    • normal 42+42 =16

array new 与 array delete

vc 还会存储数组的长度.会占用4个byte

1
2
3
4
Complex* p = new Complex[3]
delete[] p;
//Error
delete p //如果不适用中括号,编译器不会调用多次析构函数。数组中的内容。析构函数负责删除自己的动态申请的东西,其引用的内容会引发内存泄漏