C / C++内存管理

C / C++中程序内存区域划分

1.内核空间(用户代码 不能读写)
2.栈 (非静态局部变量/函数参数/返回值等等) 向下增长
3.内存映射段(文件映射 动态库 匿名映射)
4.堆 (用于程序运行时动态内存分配) 向上增长
5.数据段 ----储存全局数据和静态数据
5.代码段 ----可执行的代码 / 只读常量

C语言中动态内存管理方式
malloc / calloc / realloc / free
void Text()
{
	int* p1 = (int*)malloc(sizeof(int));
	free(p1);
	
	int* p2 = (int*)calloc(1, sizeof(int));
	
	int* p3 = (int*)realloc(p2, sizeof(int) * 1);
	//p3 将 p2 的内存大小改变了 ,并且两个指向一个地址
}
C++内存管理方式

通过 new 和 delete 操作符进行动态内存管理

void Text()
{
	//动态申请一个int类型的空间
	int* p1 = new int;
	//动态申请一个int类型的空间并初始化为10
	int* p2 = new int(10);
	//动态申请10个int类型的空间
	int* p3 = new int[10];

	delete p1;
	delete p2;
	delete[] p3;
}

在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数

malloc / free和 new / delete的区别

1.malloc / free是函数,new / delete是操作符
2.malloc申请空间不会初始化,new可以初始化
3. malloc申请空间时,需要手动计算空间大小并传递,new只用在后面跟上空间类型
4.malloc 返回值为void*,在使用时必须强转, new不需要
5.malloc 申请空间失败时,返回的是NULL,因此使用时必须判空,new不需要,new需要异常捕获
6.申请自定义类型对象时,malloc / free只会开辟空间 , 不会调用构造函数和析构函数 . new会调用构造函数,delete会调用析构函数

设计一个类,只能在堆上创建对象
要控制所有的从栈上创建的可能

  1. 拷贝构造 / 赋值构造禁止 构造函数私有化
  2. 要调用new
class HeapOnly
{
public:
	static HeapOnly* Creat()
	{
		return new HeapOnly;
	}
private:
	HeapOnly()
	{}
	//只声明 不实现
	HeapOnly(const HeapOnly&);
	
	bool operator=(const HeapOnly& d);
};

设计一个类,只能在栈上创建对象
只要将 new屏蔽掉就好了

class StackOnly
{
public:
	StackOnly()
	{}
private:
	void* operator new(size_t size);
	//个人觉得不需要对delete进行重载,因为没有new
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值