【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);
}
相关推荐
老歌老听老掉牙4 分钟前
OpenCascade几何建模:平面创建与法向拉伸的工程实现
c++·平面·opencascade
-凌凌漆-18 分钟前
【Qt】【C++】虚析构函数及 virtual ~Base() = default
java·c++·qt
励志不掉头发的内向程序员1 小时前
STL库——AVL树
开发语言·c++·学习
汉克老师7 小时前
第十四届蓝桥杯青少组C++选拔赛[2023.2.12]第二部分编程题(5、机甲战士)
c++·算法·蓝桥杯·01背包·蓝桥杯c++·c++蓝桥杯
Mr_Xuhhh8 小时前
项目需求分析(2)
c++·算法·leetcode·log4j
PAK向日葵8 小时前
【C/C++】面试官:手写一个memmove,要求性能尽可能高
c语言·c++·面试
Jared_devin9 小时前
二叉树算法题—— [蓝桥杯 2019 省 AB] 完全二叉树的权值
数据结构·c++·算法·职场和发展·蓝桥杯
搞全栈小苏9 小时前
基于Qt QML和C++的MQTT测试客户端(CMakeLists实现)
xml·c++·qt
啊?啊?10 小时前
18 从对象内存到函数调用:C++ 虚函数表原理(继承覆盖 / 动态绑定)+ 多态实战
开发语言·c++·多态原理
bkspiderx10 小时前
C++标准库:文件流类
开发语言·c++