C++的内存管理

一、C/C++中的内存区域划分

我们一般把C/C++中的内存区域划分成四个部分:1.栈 2.堆 3. 数据段 4.代码段
栈:对于生成在函数的局部变量一般是在栈里面。栈区的特点是分配和释放内存非常快,但是只能存储固定大小的数据,并且它的生命周期随函数调用的结束而结束,一旦函数执行结束,栈中的数据就会被自动清空,所以不需要手动释放栈上的内存。
栈区操作的基本原则是"先进后出"。每当函数被调用时,栈指针就会向下移动,分配一段新的内存空间作为栈帧,将函数的参数和局部变量压入栈帧中;当函数调用结束时,栈指针就会向上移动,释放栈帧所占用的内存空间。
但是栈的生存周期比较短因此不应该在栈上存储需要长时间保存的数据。

堆:是程序员自己开辟出来的空间,在堆里面开辟出来的空间需要程序员进行手动的释放要不然会容易导致内存泄漏。堆是一块动态分配的内存区域,用于存储程序运行时需要动态分配的数据。堆区的特点是可以动态分配内存,大小不受限制,但是分配和释放内存的效率比较低,并且需要手动释放堆上的内存。

数据段:数据段(Data Segment)是程序运行时分配的静态内存区域,用于存储程序中已初始化的静态变量、全局变量、常量等静态数据。数据段在程序运行时就会被加载到内存中,并且不会被自动释放。与栈和堆不同,数据段的大小是固定的,由编译器在编译时就确定了。数据段里的变量的生命周期和整个程序运行时期是相同的,不会自动释放,所以需要谨慎管理变量的使用和释放。

代码段:代码段(Code Segment)也叫只读代码段(Read-Only Code Segment),是一块存储着程序执行代码的内存区域,它通常是一个只读的区域。一般存储着可执行代码和只读常量。

在这里插入图片描述
在这里插入图片描述
前面五个题分别是C C C A A,数组名存储的是首元素的地址就是1的地址也是存储在栈里面的,char2 char2[]存储的"abcd\0",是将代码段中的拷贝进栈里面来,char2存储的地址也是在栈里面A,*char2进行解引用出来a也是在栈里面的。Pchar3是栈里面的一个指针也是栈里面的,*pChar进行指针的解引用会是在常量区里面也就是在代码段里面的。

二、new和delete

C语言内存管理方式在C++中可以继续使用,但有些地方就无能为力,而且使用起来比较麻烦,因此C++又提
出了自己的内存管理方式:通过new和delete操作符进行动态内存管理。
在 C++ 中,new 是用来动态分配内存的操作符,delete 是用来释放动态分配的内存的操作符。new 的基本语法如下:
type *pointer = new type;
其中:
type 为指针指向的类型;
pointer 为指向分配内存空间的指针;
new 会为 type 类型的变量分配内存,并返回指向这块内存的 pointer,可以用于初始化这块内存空间,并在其中分配合适的值。
例如,分配一个 int 类型的空间:
int *p = new int;
*p = 100; // 将分配的内存空间赋值为 100

void Test()
{
 // 动态申请一个int类型的空间

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

 int* ptr5 = new int(10);
 
 // 动态申请10个int类型的空间

 int* ptr6 = new int[3];
 
 delete ptr4;
 delete ptr5;
 delete[] ptr6;
}

值得注意的是,类型必须对齐。

A* p6 = new A[3]{012}

也可以这样写直接初始化一个数组。
new和malloc在对内置类型没有根本的区别,对于内置类型new就是会比malloc使用起来要更加方便一些,但是对于自定义类型,new可以直接调用自定义类型的构造函数进行初始化会方便很多,delete可以直接调用析构函数。

operator new 和 operator delete

通常情况下我们使用 new 和 delete 关键字来进行动态内存分配和释放即可,因为 C++ 已经为我们封装好了 operator new 和 operator delete 函数。

new和delete是用户进行动态内存申请和释放的操作符,operator new 和operator delete是系统提供的

全局函数,new在底层调用operator new全局函数来申请空间,delete在底层通过operator delete全局函数来释放空间。
operator new其实本质上还是对c语言中malloc函数进行了封装,调用operator new其实本质上还是调用的malloc函数。那么operator delete就是同理对free的封装。

operator new 是一个全局函数,用于动态分配内存,其语法通常为以下形式:
void* operator new (size_t size);size_t是数据类型,申请的size是大小字节数。
但是平常我们会用new和delete就可以了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值