c/c++动态内存管理

1.malloc 和 new的区别

转http://blog.csdn.net/zjc156m/article/details/16819357

2.new/delete的使用方法

c/c++动态内存管理_第1张图片

注意new\delete的配对使用,否则可能会出现内存泄漏或者程序崩溃的问题


3.剖析new/delete & new[]/delete[]

(1)new/delete

new调用了operator new(),delete调用了operator delete(),

operator new和operator delete和malloc/free的用法相同,他们只负责分配/释放空间

不会调用构造函数和析构函数来初始化/清理对象

相当于operator new()/operator delete()只是malloc/free的一层封装

在调试过程中可以看到new/delete调用函数的过程,如图

c/c++动态内存管理_第2张图片

(2)new[]/delete[]

new[count]是先动态开辟出一块count个对象空间,并在其最前面额外开辟出一块int型空间存放count。

delete[],先找到存放count的空间,再从存放count空间的后面析构count次(清理对象),再调用

operator delete[]()释放空间

如图

c/c++动态内存管理_第3张图片

我们可以用宏模拟实现一下new[count]/delete[]操作符申请空间/释放空间

模拟实现new[count]

#define NEW_ARR(PTR,TYPE,N)	\	//利用续行符 \ 提高代码可读性
	do			\
	{			\
		PTR = (TYPE*)operator new(sizeof(TYPE)*N+4);	\	//额外开辟4个字节存放对象个数N
		*(int*)PTR = N;					\
		PTR = (TYPE*)((int*)PTR +1);	\
		for(int i=0; i

模拟实现delete[]

#define DELETE_ARR(PTR,TYPE) 	\
	do		\
	{		\
		int n = *((int*)PTR-1);	\	//找出ptr前4个字节中存放的N
		PTR = (TYPE*)PTR;		\
		for(int i=0; i




你可能感兴趣的:(cpp)