C/C++内存管理

本文详细解析了C/C++中的内存分布,包括栈、堆、全局区、常量区和代码区的功能与特性。深入探讨了C语言中动态内存管理函数如malloc、calloc、realloc和free的使用,以及C++特有的new/delete操作符如何更高效地管理内存,特别是自定义类型的对象。

C/C++内存分布

栈,堆,全局区,常量区,代码区

  1. 栈, 又叫堆栈,系统自动分配的空间,只要不特殊声明,就定义在栈区,比如非静态局部变量,函数参数,返回值等等,函数的区域也在栈上,栈是向下增长的。
  2. 使用动态内存分配的方式可以申请堆空间,使用完要记得手动释放
  3. 全局区:静态变量(static),全局变量
  4. 常量区:代码区中的数字,字符等常量,例如 ‘a’, -1.2等
  5. 代码区:存放可执行的代码,避免频繁的读硬盘

C语言中动态内存管理方式

malloc/calloc/realloc和free 是C语言中stdlib.h中提供的函数

void * malloc(size_t, size_t);
void * calloc(size_t, size_t);

malloc不会进行初始化,calloc会初始化空间为0,所以在追求效率的时候,使用malloc较优。

void realloc(void * p, size_t size);
realloc 的用法是申请size个字节的空间, 将指针p所指向空间中的数据拷贝到刚申请的空间当中,释放p,返回刚申请到的空间的首地址

void * free(void *);
记得手动释放动态开辟的内存

C++内存管理方式

C语言内存管理方式在C++中可以继续使用,但是在某些特定的地方使用起来就会比较麻烦。

也就是通过new和delete操作符进行动态内存管理,注意它们是运算符

比如通过动态内存分配实例化对象d的时候,new/delete会自动调用构造/析构函数,而malloc/free不会。
因此C++提出了自己的内存管理方式,当我们在给类分配空间的时候,最好使用new/delete

new/delete的简单操作

int main()
{
	//动态申请一个int类型的空间
	int * ptr = new int;

	//动态申请一个int类型的空间并初始化为10
	int * ptr1 = new int(10);

	//动态申请3个int类型的空间
	int * ptr2 = new int[3];

	delete ptr;
	delete ptr1;
	delete[] ptr2;

	system("pause");
	return 0;
}

注意:申请和释放单个元素的空间,使用new/delete操作符,申请和释放连续的空间,使用new[]和delete[]

对于自定义类型的new/delete操作

class Test
{
	int m_data;
public:
	Test() :
		m_data(0)
	{
		cout << "Test():" << this << endl;
	}

	~Test()
	{
		cout << "~Test():" << this << endl;
	}
};

void test1()
{
	//申请单个Test类型的空间
	Test * pt = (Test *)malloc(sizeof(Test));
	free(pt);

	//申请10个Test类型的空间
	Test * pt1 = (Test *)malloc(sizeof(Test)* 10);
	free(pt1);
}

void test2()
{
	//申请单个Test类型的空间
	Test * p1 = new Test;
	delete p1;
	
	//申请10个Test类型的空间
	Test * p2 = new Test[10];
	delete[] p2;
}
int main()
{
	//test1();

	test2();

	system("pause");
	return 0;
}

注意: 从上面的代码我们可以看出, 在申请自定义类型的空间时, new会调用构造函数, delete会调用析构函数, 而malloc和free不会

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值