广州网站建设及推广,在线网页制作,动漫制作好找工作吗,招聘网站如何做推广目录
一、内存分布
1.1内存分布图#xff1a; 1.2 为什么要将bss和data区分开呢#xff1f;
1.3 堆和栈有什么区别 二、malloc、free#xff1b;new、delete
2.1 new和delete是如何实现的#xff0c;new与malloc的异同处
2.2既然有了malloc/free#xff0c;C为什么还…目录
一、内存分布
1.1内存分布图 1.2 为什么要将bss和data区分开呢
1.3 堆和栈有什么区别 二、malloc、freenew、delete
2.1 new和delete是如何实现的new与malloc的异同处
2.2既然有了malloc/freeC为什么还需要new/delete 一、内存分布
1.1内存分布图 1.2 为什么要将bss和data区分开呢
在程序编译的时候不会给.bss段中的数据分配空间只是记录数据所需空间的大小。在程序执行的时候才会给.bss段中的数据分配内存。通过这种方式可以节省一部分内存空间进一步缩减可执行程序的大小。
1.3 堆和栈有什么区别
堆是由malloc和new动态开辟的一段内存由程序员自己管理和释放。栈则是由编译器自己开辟和管理的内存一般用来存放函数的传参和局部变量。
堆空间由于频繁开辟和释放所以会产生内存碎片的问题。
堆的生长空间向上地址越来越大栈则是向下地址越来越小。栈的空间很小只有8M而堆有4G。 二、malloc、freenew、delete
2.1 new和delete是如何实现的new与malloc的异同处
new和delete是对malloc和free的封装new一个对象时会首先调用malloc分配空间然后执行对象的构造函数初始化这块空间delete则会先调用对象的析构函数然后调用free释放这块空间。
他们最大的区别则是 1、new会调用构造函数初始化空间。2、new并不需要指定资源的大小。3、new的返回值是对象类型的指针而malloc则是void * 的指针。4、new如果调用失败则会抛异常而malloc调用失败则会返回NULL。5、new是一个操作符malloc则是函数operator new可以被重载。
2.2既然有了malloc/freeC为什么还需要new/delete
这四个函数都是用来申请和释放内存。new/delete主要是对malloc/free进行了封装使其能更好地申请和释放C的对象资源否则就得malloc一块空间然后手动调用构造函数。
而malloc/free是已经编译好的库函数其还要兼容C语言不能够轻易修改所以将其封装起来实现了new/delete。