<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"> <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path> </svg> <blockquote>
讯享网
大家好,我是苏貝,本篇博客带大家了解C++的内存管理,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️

讯享网

【说明】
- 栈又叫堆栈–非静态局部变量/函数参数/返回值等等,栈是向下增长的。
- 内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存,做进程间通信。堆用于程序运行时动态内存分配,堆是可以向上增长的。
- 数据段–存储全局数据和静态数据。
- 代码段–可执行的代码/只读常量
我们先来看下面的一段代码和相关问题

问:


前5个(从左到右):CCCAA
全局变量和static变量放在(数据段)静态区(前3个)
局部变量放在栈区(第四个)
Num1是局部的数组,它的值是首元素地址,局部数组在栈区
后5个(从左到右):AAADAB
前2个:char2是局部的数组,它的值是首元素地址,局部数组在栈区。”abcd”在常量区,实际上是”abcd0”。将”abcd0”赋值给数组,是将常量区的”abcd0”赋值一份到栈区,再让数组指向栈区的“abcd0”(看下图)。char2的值是首元素地址,*char2就是首元素a,在栈区。

问:



- malloc/calloc/realloc的区别
malloc开辟的空间不会初始化。calloc开辟的空间会将每个字节初始化为0。realloc可以调整开辟空间的大小(不初始化为0),调大空间:原地扩容(后面有足够空间)或者异地扩容(后面无足够空间,另外找一个足够的连续空间)。
- 这里需要free(p2)吗?
不用,如果要异地扩容,那么realloc会自动free掉p2指向的空间。如果是原地扩容,free(p3)即可。
C语言内存管理方式在C++中可以继续使用,但有些地方就无能为力,而且使用起来比较麻烦,因此C++又提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理。

new 类型后面没有接[类型个数],默认申请1个该类型的空间
申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用 new[ ]和delete[ ],注意:匹配起来使用。
所以new和malloc的区别在哪里?
- 用法上更简洁,如上
- 可以控制初始化

给多个连续的元素初始化,如果初始值的个数少于元素的个数,那么没有初始值的元素就被初始化为0
- 在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc与 free不会。

- new失败后会抛异常,不需要我们手动检查
C


C++


好了,那么本篇博客就到此结束了,如果你觉得本篇博客对你有些帮助,可以给个大大的赞👍吗,感谢看到这里,我们下篇博客见❤️

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/166654.html