new和malloc的内存分配位置有何不同?内存分配都在堆上进行。new和malloc关于自由存储区的说法有所不同,new可能分配在自由存储区,而自由存储区可以是堆也可以不是,这取决于new内部的实现。操作系统在堆上维护一个空闲内存链表,当需要分配内存时,会查找这个链表,找到一块大于所需内存的区域,分配内存并将剩余的内存空间返还到空闲链表上(如果有剩余的话)。new/delete和malloc/free之间的区别有哪些?1. malloc和free是库函数,而new和delete是C++操作符;2. new自动计算所需空间大小,例如“int *a = new”,而malloc需要指定大小,例如“int *a = malloc(sizeof(int))”;3. new在动态分配内存时可以初始化对象,调用其构造函数,delete在释放内存时调用对象的析构函数。而malloc只分配一段给定大小的内存,并返回该内存首地址指针,如果失败,返回NULL;4. new是C++操作符,是关键字,而operator new是C++库函数;5. operator new/operator delete可以重载,而malloc不能;6. new可以调用malloc来实现,但是malloc不能调用new来实现;7. 对于数据,C++定义new[]专门进行动态数组分配,用delete[]进行销毁。new[]会一次分配内存,然后多次调用构造函数;delete[]会先多次调用析构函数,然后一次性释放;8. malloc能够直观地重新分配内存。使用malloc分配内存后,如果在使用过程中发现内存不足,可以使用realloc函数进行内存重新分配实现内存的扩充。realloc先判断当前的指针所指内存是否有足够的连续空间,如果有,原地扩大可分配的内存地址,并返回原来的地址指针;如果空间不够,先按照新指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域,然后释放原来的内存区域。new没有这样直观的配套设施来扩充内存。new和malloc内部实现的区别是什么?new的实现分为两步:1. 调用operator new()分配内存,如果内存不足则失败并抛出异常;2. 如果需要的话,在那段内存上初始化对象(赋值或调用构造函数),这是由编译器根据代码来控制的。因此,new和malloc检查是否正确分配的方法不同。为了照顾原来习惯的程序员,C++可以通过nothrow关键字来实现new不抛异常而返回NULL。malloc的实现是从网上参考多篇文献,自己编写的一个版本。虽然未经测试,但应该能够说明malloc的原理。系统为堆区保存了两个指针,一个指向堆的首地址,一个指向堆的尾地址。系统通过结构体mem_control_block将整个堆区分成一个个块,每个块都以这样一个结构体开头,结构体里维护了块的大小。malloc分配内存时,从第一个块开始遍历,如果找到的块已被使用,则找下一个块。如果找到的块比所需的小,则继续找下一个块,直到找到比我需要大于等于的块。然后将该块mem_control_block中的标志位设置为已使用,如果块有剩余的空间,就将剩余的空间添加一个mem_control_block变成一个新块。如果遍历了整个堆空间都没有找到合适的块,则调用sbrk函数扩大堆的范围。通过上面的代码可以知道,当我们调用malloc分配n个字节的空间时,实际上占用了n + sizeof(mem_control_block)个字节的空间。但是返回的地址是紧跟结构体mem_control_block后面的第一个地址。那么聪明的你应该已经猜到了free是如何释放内存的。没错,就是把指针往回倒个sizeof(mem_control_block)的距离,然后设置标志位为可用。为了减少内存碎片,会查找前面一个块和后面一个块,如果有空闲块就合并为一个。