C++中的动态内存管理

1 C&C++中的动态内存管理
C语言内存管理方式在C++中可以继续使用,但有些地方就无能为力而且使用起来比较麻烦,因此C++又提出 了自己的内存管理方式:通过new和delete操作符进行动态内存管理。

2 C++中如何实现动态内存管理

操作符: new/delete , new[ ]/delete[ ] ;
3 C++中具体实现动态内存管理(代码详解版)
代码如下:
new /delete 操作内置类型


#include<iostream>
#include<stdlib.h>
using namespace  std;
 //new和delete 操作内置类型
int main(){
	// 动态申请一个int 类型的空间
	int *p1 = new int;
	//动态申请一个int 类型的空间并初始化
	int *p2 = new int(10);
	// 动态申请10 个int类型的空间
	int *p3 = new int[10];

	int a = 10;
	int b = 20; 
	int c = 30;
	p1 = &a;
	p2 = &b;
	p3 = &c;

	printf("%p\n", p1);
	printf("%p\n", p2);
	printf("%p\n", p3);


	printf("%d\n", *p1);
	printf("%d\n", *p2);
	printf("%d\n", *p3);

	delete p1;
	delete p2;
	delete [] p3;
	system("pause");
	return 0;
	注意:申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用new[]和 delete[]

}

new/delete 操作自定义类型

#include<iostream>
#include<stdlib.h>
#include<malloc.h>
using namespace  std;

//new和delete操作自定义类


class Date
{
public:
	// 全缺省的构造函数
	Date(int year = 1900, int month = 1, int day = 1)
		: _year(year)
		, _month(month)
		, _day(day)
	{
		cout << "Date()" << endl;
	}

	Date(const Date& d)
		: _year(d._year)
		, _month(d._month)
		, _day(d._day)
	{}


	~Date()
	{
		cout << "~Date()" << endl;
	}


private:
	int _year;
	int _month;
	int _day;
};



int main(){
	// 申请单个  Date 类型的空间
	Date  *p1 = (Date*) malloc(sizeof(Date));
	free(p1);

	Date * p2 = new Date;
	delete p2;
	//Date * p2 = new Date;
	//delete p2;

	// 申请 10 个Date类型的空间
	Date*p3 = (Date*)malloc(sizeof(Date)* 10);
	free(p3);

	Date*p4 = new Date[10];
	delete[]p4;
	//Date*p4 = new Date[10];
	//delete[]p4;

	system("pause");
	return 0;
}
//注意:在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc与free不会。

4 new/delete 实现的原理
4.1 操作内置类型时
如果申请的是内置类型的空间,new和malloc,delete和free基本 类似,不同的地方是:malloc/free申请和 释放的是单个元素的空间,new[]和delete[]申请的是连续空间,而且new在申请空间失败时会抛异常, malloc会返回NULL

4.2 自定义类型
new的原理
1 调用operator new函数申请空间
2 在申请的空间上执行构造函数,完成对象的构造

delete的原理
1 在空间上执行析构函数,完成对象中资源的清理工作
2. 调用operator delete函数释放对象的空间

new T[N]的原理
1 调用operator new[]函数,在operator new[]中实际调用operator new函数完成N个对象空间的申 请
2. 在申请的空间上执行N次构造函数

delete[]的原理
1. 在释放的对象空间上执行N次析构函数,完成N个对象中资源 的清理
2. 2. 调用operator delete[]释放空间,实际在operator delete[]中调用operator delete来释放空间

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页