面试中是不是经常被问道new和malloc的区别?
网上的答案也是五花八门,于是乎写了个程序验证一下
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
int main(int argc, char ** argv)
{
auto a = new int[10];
free(a); // 说明new出来的内存可以用free释放掉,仅限于没有析构的情况
int *b = (int*)malloc(10*sizeof(int));
delete b; // malloc出来的内存可用delete释放掉,仅限于没有析构的情况
auto c = new int[10];
delete c; // 数组不是非得用 delete [],仅限于没有析构的情况
auto d = new int[10];
delete [] d; // 标准写法
a[5] = 0;
b[5] = 0;
c[5] = 0;
d[5] = 5;
std::cout << "a=" << a << std::endl;
std::cout << "b=" << b << std::endl;
std::cout << "c=" << c << std::endl;
std::cout << "d=" << d << std::endl;
std::cout << "a[5]=" << a[5] << std::endl;
std::cout << "b[5]=" << b[5] << std::endl;
std::cout << "c[5]=" << c[5] << std::endl;
std::cout << "d[5]=" << d[5] << std::endl;
return 0;
}
/*******
> gcc test.cpp -lstdc++ -otest.x
> ./test.x
a=0x562412e9beb0
b=0x562412e9beb0
c=0x562412e9beb0
d=0x562412e9beb0
a[5]=5
b[5]=5
c[5]=5
d[5]=5
// 说明new和malloc都走的是操作系统的堆内存分配逻辑,即free回收的内存放入空闲块列表,下次声请内存从空闲列表中找相同大小的空闲内存块
*******/
上面这个程序可以说明几点:
1.new/delete内部实现使用的还是malloc和free的逻辑,也还是从heap上分配内存;
2.堆内存分配规则是寻址尺寸大小相近的空闲内存块;