动态内存管理

文章详细阐述了C++中的内存分布,包括栈、静态、全局、常量和动态数据的存储位置及生命周期。接着讨论了C++的内存管理,特别是new和delete操作在处理内置类型和自定义类型时的角色,以及如何通过构造函数和析构函数确保对象的正确创建和销毁。最后介绍了定位new的概念,这是一种允许在特定内存地址创建对象的机制。

目录

​编辑

一、C/C++内存分布

 二、C++内存管理

1.new和delete操作内置类型 

2.new和delete操作自定义类型 

 三、定位new


 

一、C/C++内存分布

在C/C++中,程序中需要存储的数据可分为:局部数据、静态数据、全局数据、常量数据和动态申请数据,这些数据都有其独特的存储位置和生命周期。

1.局部数据:局部数据是在函数内声明的变量,在函数调用时被创建,函数返回时被销毁,存储在栈区

2.静态数据:静态数据使用static关键字声明,在整个程序生命周期存在,存储在静态区

3.全局数据:全局变量是在函数外部声明的变量,具有全局作用域和全局可见性,生命周期直到程序结束,存储在全局数据区

4.常量数据:常量数据是指在程序中使用字面值或使用 const 修饰符声明的变量,它们的值在程序执行期间保持不变。常量数据存储在只读数据区中,通常与全局数据存储在同一区域

5.动态申请数据:动态申请数据是通过使用 new 运算符(C++)或 malloc() 函数(C)在内存中手动分配的数据。动态申请的数据需要通过 delete 运算符(C++)或 free() 函数(C)显式释放。

说明:

1.栈又叫堆栈--非静态局部变量/函数参数/返回值等等,栈是向下增长的。      

2.内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存,做进程间通信。

3.堆用于程序运行时动态内存分配,堆是可以上增长的
4.数据段--存储全局数据和静态数据
5.代码段--可执行的代码/只读常量。

 二、C++内存管理

C++自己的动态内存管理操作符:new和delete

1.new和delete操作内置类型 

2.new和delete操作自定义类型 

C++自定义类型申请动态内存,需要有适当的构造函数和析构函数,以确保对象的正确创建和销毁。分配动态内存分配时,会先调用构造函数,释放时自动调用对象的析构函数。

 三、定位new

定位new是C++的一种扩展形式,它允许在指定的内存地址上创建对象,而不是使用默认的动态内存分配机制。

语法:new (address) Type [initializer];

其中,address是指定的内存地址,Type是要创建的对象类型,initializer是可选的初始化参数。

使用定位new时,编译器不会分配新的内存,而是在指定的地址上构造对象。

class EG
{
public:
	EG(int a = 0)
		:_a(a)
	{
		cout << "EG(int a = 0)" << endl;
	}
	~EG()
	{
		cout << "~EG()" << endl;
	}
private:
	int _a;
};
int main()
{
	EG* p1 = (EG*)malloc(sizeof(EG));
	new(p1)EG;	//如果类的构造函数有参数时,此处需要传参
	p1->~EG();	//手动调用析构函数
	free(p1);

	EG* p2 = (EG*)operator new(sizeof(EG));	//分配内存
	new(p2)EG(10);	//指定地址创建对象
	p2->~EG();
	operator delete(p2);
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值