C++内存管理

C++内存管理(超长,例子很详细,排版很好)_草根caogen的博客-CSDN博客

秒懂 栈内存和堆内存(深入底层)_Just 慢羊羊的博客-CSDN博客

new/delete和malloc/free的区别以及联系_newdelete和mallocfree_秃菜鸟的博客-CSDN博客

C++中内存的分配_empty__barrel的博客-CSDN博客

c++如何让类对象只能在堆(栈)上分配空间_对象只在堆上_小飞侠hello的博客-CSDN博客

C/C++ 字节对齐_c++字节对齐_chengonghao的博客-CSDN博客

C++11新增关键字~alignas(struct对齐、sizeof、alignof)_c++ alignas_农村苞米地的博客-CSDN博客

#pragma pack(push) 和#pragma pack(pop) 以及#pragma pack()_luoyajingfeng2的博客-CSDN博客

C++数组的创建及使用(静态数组与动态数组)_c++创建数组_声希Censh的博客-CSDN博客

数组与地址,数组名到底是什么?_数组名是地址吗_Jambo!的博客-CSDN博客

自由存储区与堆_ADHERENTS的博客-CSDN博客

new/delete和malloc/free的区别以及联系_newdelete和mallocfree_秃菜鸟的博客-CSDN博客

delete 和 delete []的真正区别_delete[]_帅气滴点C的博客-CSDN博客

delete和delete[]的理解_why_s_serious的博客-CSDN博客

当为数组动态创建内存,所有编译器在分配内存时,会在数组首地址之前再申请一块空间用于记录数组个数(如果没有析构函数就不需要知道个数,编译器也就不会多申请这块空间),对于x64,这个大小存储在数组首地址的前八个字节,对于x86则是前4个字节。

delete[]传入的是申请的记录数组个数的地址,delete传入的是数组首地址。

使用delete[] 来释放一个对象和使用delete[]来释放一个对象数组都不对。

在分配含有析构函数的自定义对象时,会多申请8个字节用于记录数组大小,方便调用析构函数时知道要调用多少次,所以在使用delete去释放一个数组对象时,由于传入的是数组首地址,但是申请的内存应该是数组首地址再往前8个字节的位置,数组首地址操作系统并未记录,所以会出错,

同样的,使用delete[]去释放单个对象,由于他会访问前8个字节取得大小从而决定调用多少次析构函数,这时候行为将会不确定,取决于前8个字节会是什么值,可能会调用很多次析构函数,但在最后free时会出错,因为new对象时记录的是首地址,而不是首地址-8。

C++之new内存空间不足时set_new_handler()函数和nothrow常量_set_new_handler调用失败_代码乌龟的博客-CSDN博客

继承分为:虚函数单继承、虚函数多继承、单虚拟继承、多虚拟继承

虚基类表(不占用类对象的存储空间)(需要强调的是,虚基类依旧会在子类里面存在拷贝,只是仅仅最多存在一份而已,并不是不在子类里面了)

C++普通继承、多继承、虚继承内存空间排布分析_c++ 继承内存分布_长不大的程序员的博客-CSDN博客

c++对象模型05:虚继承内存布局_c++虚继承内存结构_为成大道踏平坎坷的博客-CSDN博客

一文读懂C++虚函数的内存模型_虚函数内存模型_彼 方的博客-CSDN博客

一文读懂C++虚继承的内存模型_c++虚继承下的内存模型_彼 方的博客-CSDN博客

**3. 如果在派生类中重写了基类中的虚函数,基类中的虚函数是会被覆盖的,之后如果需要调用基类的虚函数,需要通过基类名::函数名调用。**

你可能感兴趣的:(c++)