C++中new/delete和malloc/free行为推导

面试中是不是经常被问道new和malloc的区别?

网上的答案也是五花八门,于是乎写了个程序验证一下

#include 
#include 
#include 

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.堆内存分配规则是寻址尺寸大小相近的空闲内存块;

你可能感兴趣的:(c++,Linux操作系统,内存管理)