【C++】内存管理

1. 内存分布

【说明】

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

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

  3. 用于程序运行时动态内存分配,堆是可以上增长的。

  4. 数据段--存储全局数据和静态数据。

  5. 代码段--可执行的代码/只读常量。

2. C++内存管理方式

a. new , delete 操作内置类型

代码举例

复制代码
#include <iostream>
using namespace std;
int main()
{
	int* pa = new int;
  // 相当于在堆上开辟了一个 int 类型的空间
	delete pa;
	int* pb = new int(10);
  //相当于在堆上开辟了一个 int 类型的空间并且初始化为 10
	delete pb;
	int* pc = new int[10];
  //相当于在堆上开辟了十个 int 类型的空间
	delete[] pc;
}

注意:

  1. 申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用new[]和delete[]
  2. 要搭配使用(如:malloc 对应 free , new 对应 delete)

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

代码举例

复制代码
#include <iostream>
using namespace std;
class stack
{
public:
	stack()
	{
		cout << "stack()" << endl;
		_a = new int[10];
		_top = 0;
		_capacity = 10;
	}
	~stack()
	{
		cout << "~stack()" << endl;
		delete _a;
	}
private:
	int* _a;
	int _top;
	int _capacity;
};
int main()
{
	stack* p = new stack;
  //先开辟空间,再调用构造函数
	delete p;
  //先调用析构函数,再销毁 p 开辟的空间
}

运行结果:

注意:

C 语言中的 malloc / realloc 对于自定义类型不会进行调用它的构造函数和析构函数

3. operator new与operator delete函数

new和delete 是用户进行动态内存申请和释放的 操作符

operator new 和operator delete 是系统提供的全局函数

new在底层调用,operator new全局函数来申请空间

delete在底层通过 ,operator delete全局函数来释放空间。

注意:

  1. operator new:该函数实际通过malloc来申请空间,当malloc申请空间成功时直接返回;失败则会抛出bad_alloc 类型异常
  2. operator delete: 该函数最终是通过free来释放空间的

4. 定位new表达式(placement-new)

定位new表达式是在已分配的原始内存空间中调用构造函数初始化一个对象

代码举例1

复制代码
#include <iostream>
using namespace std;
class stack
{
public:
	stack()
	{
		cout << "stack()" << endl;
		_a = new int[10];
		_top = 0;
		_capacity = 10;
	}
	~stack()
	{
		cout << "~stack()" << endl;
		delete _a;
	}
private:
	int* _a;
	int _top;
	int _capacity;
};
int main()
{
	stack* p = (stack *)malloc(sizeof(stack));
	new(p)stack;
  //调用构造函数
	p->~stack();
  //调用析构函数
	free(p);
}

代码举例2

复制代码
#include <iostream>
using namespace std;
class stack
{
public:
	stack(int capcity)
	{
		cout << "stack()" << endl;
		_a = new int[capcity];
		_top = 0;
		_capacity = capcity;
	}
	~stack()
	{
		cout << "~stack()" << endl;
		delete _a;
	}
private:
	int* _a;
	int _top;
	int _capacity;
};
int main()
{
	stack* p = (stack *)malloc(sizeof(stack));
	new(p)stack(4);
	p->~stack();
	free(p);
}
相关推荐
愚戏师7 小时前
软件工程(应试版)图形工具总结(二)
数据结构·c++·python·软件工程
owde7 小时前
顺序容器 -forward list单链表
数据结构·c++·list
矛取矛求7 小时前
C++ 标准库参考手册深度解析
java·开发语言·c++
lmy201211087 小时前
GESP:2025-3月等级8-T1-上学
c++·算法·图论·dijkstra
٩( 'ω' )و2607 小时前
stl_list的模拟实现
开发语言·c++·list
&Sinnt&7 小时前
C++/Qt 模拟sensornetwork的工作
c++·qt
奕天者7 小时前
C++学习笔记(三十三)——forward_list
c++·笔记·学习
珊瑚里的鱼8 小时前
第五讲(下)| string类的模拟实现
开发语言·c++·笔记·程序人生·算法·visualstudio·visual studio
longlong int9 小时前
【每日算法】Day 17-1:位图(Bitmap)——十亿级数据去重与快速检索的终极方案(C++实现)
开发语言·c++·算法
myloveasuka10 小时前
[Linux]进程与PCB的关系,进程的基本操作
linux·c语言·c++