随笔分类 -  C++重点 / 内存管理

摘要:# 15.类对象的大小受哪些因素影响? 1.类的非静态成员变量大小,静态成员不占据类的空间,成员函数也不占据类的空间大小; 2.内存对齐另外分配的空间大小,类内的数据也是需要进行内存对齐操作的; 3.虚函数的话,会在类对象插入vptr指针,加上指针大小; 4.当该类是某类的派生类,那么派生类继承的基 阅读全文
posted @ 2023-08-02 22:01 CodeMagicianT 阅读(78) 评论(0) 推荐(0) 编辑
摘要:# 14.this指针调用成员变量时,堆栈会发生什么变化? 当在类的非静态成员函数访问类的非静态成员时,编译器会自动将对象的地址传给作为隐含参数传递给函数,这个隐含参数就是this指针。 即使你并没有写this指针,编译器在链接时也会加上this的,对各成员的访问都是通过this的。 例如你建立了类 阅读全文
posted @ 2023-08-02 22:01 CodeMagicianT 阅读(50) 评论(0) 推荐(0) 编辑
摘要:# 13.请说一下以下几种情况下,下面几个类的大小各是多少? ```C++ class A {}; int main() { cout << sizeof(A) << endl;// 输出 1; A a; cout << sizeof(a) << endl;// 输出 1; return 0; } 阅读全文
posted @ 2023-08-02 22:00 CodeMagicianT 阅读(19) 评论(0) 推荐(0) 编辑
摘要:# 12.你知道空类的大小是多少吗? 1.C++空类的大小不为0,不同编译器设置不一样,vs设置为1 2.C++标准指出,不允许一个对象(当然包括类对象)的大小为0,不同的对象不能具有相同的地址 3.带有虚函数的C++类大小不为1,因为每一个对象会有一个vptr指向虚函数表,具体大小根据指针大小确定 阅读全文
posted @ 2023-08-02 21:59 CodeMagicianT 阅读(304) 评论(0) 推荐(1) 编辑
摘要:# 11.如果在类的析构函数中调用delete this,会发生什么? 会导致堆栈溢出。原因很简单,delete的本质是“为将被释放的内存调用一个或多个析构函数,然后,释放内存”。显然,delete this会去调用本对象的析构函数,而析构函数中又调用delete this,形成无限递归,造成堆栈溢 阅读全文
posted @ 2023-08-02 21:58 CodeMagicianT 阅读(71) 评论(0) 推荐(0) 编辑
摘要:# 10.为什么是不可预期的问题? delete this之后不是释放了类对象的内存空间了么,那么这段内存应该已经还给系统,不再属于这个进程。照这个逻辑来看,应该发生指针错误,无访问权限之类的令系统崩溃的问题才对啊?这个问题牵涉到操作系统的内存管理策略。delete this释放了类对象的内存空间, 阅读全文
posted @ 2023-08-02 21:58 CodeMagicianT 阅读(10) 评论(0) 推荐(0) 编辑
摘要:# 9.在成员函数中调用delete this会出现什么问题?对象还可以使用吗? 在类对象的内存空间中,只有数据成员和虚函数表指针,并不包含代码内容,类的成员函数单独放在代码段中。在调用成员函数时,隐含传递一个this指针,让成员函数知道当前是哪个对象在调用它。当调用delete this时,类对象 阅读全文
posted @ 2023-08-02 21:58 CodeMagicianT 阅读(54) 评论(0) 推荐(0) 编辑
摘要:# 8.内存泄漏的后果?如何监测?解决方法? ## 1.内存泄漏 ### 1.1定义 内存泄漏是指由于疏忽或错误造成了程序未能释放掉不再使用的内存的情况。内存泄漏并非指内存在物理上消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制; ### 1.2种类 #### 1.2.1C/C 阅读全文
posted @ 2023-08-02 21:57 CodeMagicianT 阅读(209) 评论(0) 推荐(0) 编辑
摘要:# 7.几个this指针的易混问题 见[6.类的*this指针有以下特点](https://www.cnblogs.com/codemagiciant/p/17601868.html) 阅读全文
posted @ 2023-08-02 21:54 CodeMagicianT 阅读(12) 评论(0) 推荐(0) 编辑
摘要:## 6.类的\*this指针有以下特点 #### 1.每个对象都有一个隐藏的this指针,但不属于对象,是编译器添加的 #### 2.this只能在成员函数中使用。全局函数、静态函数都不能使用this。 实际上,成员函数默认第一个参数为T \*const this。 如: ``` class A 阅读全文
posted @ 2023-08-02 21:52 CodeMagicianT 阅读(42) 评论(0) 推荐(0) 编辑
摘要:# 5.C++中类的数据成员和成员函数内存分布情况 - 非静态成员的数据类型大小之和。 - 编译器加入的额外成员变量(如指向虚函数表的指针)。 - 为了边缘对齐优化加入的padding。 空类(无非静态数据成员)的对象的size为1, 当作为基类时, size为0。 C++类是由结构体发展得来的,所 阅读全文
posted @ 2023-08-02 21:49 CodeMagicianT 阅读(292) 评论(0) 推荐(0) 编辑
摘要:# 4.可以说一下你了解的C++得内存管理吗? ## 1.一个由c/C++编译的程序占用的[内存](https://so.csdn.net/so/search?q=内存&spm=1001.2101.3001.7020)分为以下几个部分: C++中的内存分区,分别是堆、栈、自由存储区、全局/静态存储区 阅读全文
posted @ 2023-08-02 21:47 CodeMagicianT 阅读(68) 评论(0) 推荐(0) 编辑
摘要:# 3.什么是内存池,如何实现 内存池(Memory Pool) 是一种**内存分配**方式。通常我们习惯直接使用new、malloc 等申请内存,这样做的缺点在于:由于所申请内存块的大小不定,当频繁使用时会造成大量的内存碎片并进而降低性能。内存池则是在真正使用内存之前,先申请分配一定数量的、大小相 阅读全文
posted @ 2023-08-02 21:46 CodeMagicianT 阅读(130) 评论(0) 推荐(0) 编辑
摘要:# 2.简要说明C++的内存分区 ## 1.一个由C/C++编译的程序占用的[内存](https://so.csdn.net/so/search?q=内存&spm=1001.2101.3001.7020)分为以下几个部分: C++中的内存分区,分别是堆、栈、自由存储区、全局/静态存储区、常量存储区和 阅读全文
posted @ 2023-08-02 21:46 CodeMagicianT 阅读(67) 评论(0) 推荐(0) 编辑
摘要:# 1.类的对象存储空间? - 非静态成员的数据类型大小之和。 - 编译器加入的额外成员变量(如指向虚函数表的指针)。 - 为了边缘对齐优化加入的padding。 空类(无非静态数据成员)的对象的size为1, 当作为基类时, size为0。 C++类是由结构体发展得来的,所以他们的成员变量(C语言 阅读全文
posted @ 2023-08-02 21:43 CodeMagicianT 阅读(93) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示