C++面向对象编程之堆、栈和内存形式

1.stack 是存在与某个作用域的一块内存空间,当调用函数时,函数就会形成一个stack 存这它的一些参数、返回地址等,生闷气在函数执行完会自动消灭;

2.heap 是操作系统提供的全局的内存空间,是动态分配的(new),用完了需要手动delete,不然在作用域外还会占用内存,会造成内存泄漏;

3.static 静态的,生命期直到程序结束;

4.全局变量,生命期为整个程序;

5.new 会先分配空间,在调用构造函数;

 

6.delete 会先调用析构函数,再释放内存;

 

 *这里我画的红箭头应该是错误的,上下指反了,这里的思想和继承、组合的析构很像,是由外而内的,具体请看:......

 

 7.动态分配内存实际不止分配其类型所占的内存,比如complex其有8个字节:

在debug下会有原complex占的8个字节 + debug要用到的32 + 4 个字节 + 上下2 个cookie的8个字节,因为内存一定要是16的倍数,所以还可能会补一些空的字节填充:

实际运行减掉debug的字节在填充到16倍数的字节就可以。cookie里标识所含字节数,在内存生成时在低位取1,所以是其字节数+1,释放时就正常取0;

7.对于动态分配的array,会加一个4字节的表示array 的个数:

 

8.为什么new array 删除时要用 delete[ ]呢?因为只用delete 的话只会唤醒一次delete,删除的只有array[0],用delete[ ]就算告诉编译器它是数组还可能有要删的内存,不然会导致内存泄漏!

 

posted @ 2022-05-03 16:41  acwarming  阅读(57)  评论(0编辑  收藏  举报