C++动态内存管理及其与C语言动态内存管理的差别

在C语言中,我们常用malloc、calloc、realloc和free等函数来进行动态内存管理。

但是在C++中,我们则需要用到某些操作符进行动态内存管理。

new / delete —— 动态管理对象

new[] / delete[] —— 动态管理数组

▲new / delete 和 new[] / delete[] 一定要匹配使用!否则会内存泄漏!

void Test1()
{
	int* p1 = new int;		//创建一个int*类型指针,给指向的空间分配1个int大小的空间
	int* p2 = new int(10086);	//创建一个int*类型指针,给指向的空间分配1个int大小的空间,并对其指向的空间进行初始化
	int* p3 = new int[2];		//创建一个int*类型的指针,给指向的空间分配3个int大小的空间

	p3[0] = 1;
	p3[1] = 2;

	delete p1;			//删除给p1所分配的空间
	delete p2;			//删除给p2所分配的空间
	delete[] p3;			//删除给p3所分配的空间
}

对C语言有动态内存管理的人可能会有疑惑:明明C语言中已经有 malloc / free 函数进行动态内存管理了,C++又兼容C语言,那为什么我们还要使用 new / delete 和 new[] / delete[] 呢?

这要从 new / delete 背后的机制谈起了。


在使用new时,编译器进行两步操作:

1.调用 std::operator new() 函数进行分配内存(在 operator new 中调用了 malloc()函数)

2.调用被分配类型的构造函数

在使用delete时,编译器进行两步操作:

1.调用被分配类型的析构函数

2.调用 std::operator delete() 函数进行释放内存(在operator delete() 中调用了 free()函数)


在使用new[N]时,编译器进行两步操作:

1.调用 std::operator new() 函数进行分配内存(在 operator new 中调用了 malloc()函数)

2.调用N次被分配类型的构造函数

在使用delete[]时,编译器进行两步操作:

1.调用N次被分配类型的析构函数

2.调用 std::operator delete() 函数进行释放内存(在operator delete() 中调用了 free()函数)


整体来说,malloc() 在申请内存时候不会调用构造函数,free() 释放内存之后也不会调用析构函数,而 new / delete 进行申请 / 释放内存的时候则会调用,所以简单的说,在对c++内置类型进行动态内存管理的时候,使用 malloc() / free() 和 new / delete 的差别不大,但是在对用户自定义类型进行动态内存管理的时候,则必须使用 new / delete 或 new[] / delete[]。


在使用new时,编译器进行两步操作:

1.调用 std::operator new() 函数进行分配内存(在 operator new 中调用了 malloc()函数)

2.调用被分配类型的构造函数

在使用delete时,编译器进行两步操作:

1.调用被分配类型的析构函数

2.调用 std::operator delete() 函数进行释放内存(在operator delete() 中调用了 free()函数)

你可能感兴趣的:(概念解析)