内存管理C++

cpp 复制代码
int globalVar = 1;
static int staticGlobalVar = 1;
void Test()
{
static int staticVar = 1;
int localVar = 1;
int num1[10] = { 1, 2, 3, 4 };
char char2[] = "abcd";//char2指针在栈上,在栈上开一个空间存放abcd,指针就指向这个空间。
const char* pChar3 = "abcd";//pchar3指针在栈上,指向存放在代码区的abcd;
int* ptr1 = (int*)malloc(sizeof(int) * 4);
int* ptr2 = (int*)calloc(4, sizeof(int));
int* ptr3 = (int*)realloc(ptr2, sizeof(int) * 4);
free(ptr1);
free(ptr3);
}

1内存简介

栈又叫堆栈 局部变量(非静态)、函数参数、返回值等等,栈是向下增长的。

堆用于程序运行时动态分配内存堆可以向上增长

数据段全局数据和静态数据

代码段 可执行代码和只读常量

C语言的动态内存管理方式malloc calloc realloc

cpp 复制代码
class A
{
public:
	A(int a1 = 0, int a2 = 0)
		:_a1(a1)
		,_a2(a2)
	{
		cout << "A(int a)" << endl;
	}
	A(const A& aa)
		:_a1(aa._a1)
	{
		cout << "A(const A& aa)" << endl;
	}
	A& operator=(const A& aa)
	{
		cout << "A& operator=(const A& aa)" << endl;
		if (this != &aa)
		{
			_a1 = aa._a1;
		}
		return *this;
	}
	~A()
	{
		cout << "~A()" << endl;
	}
private:
	int _a1 = 1;
	int _a2 = 1;
};
int main()
{
	int* ptr1 = new int(0);
	delete ptr1;

	int* ptr2 = new int[10] {1, 2, 3};
	delete[] ptr2;

	int* ptr3 = new int{ 0 };
	delete ptr3;

	//A* ptr4 = new A;
	//delete ptr4;

	//A aa1(1);
	//A* ptr5 = new A(aa1);
	//delete ptr5;

	//A* ptr6 = new A(1);
	//delete ptr6;

	//A* ptr7 = new A{ 1,4 };
	//delete ptr7;

	//A* ptr8 = new A[3]{ A(1,2),A(4,5)};
	//delete[] ptr8;


	return 0;
}
cpp 复制代码
//struct ListNode
//{
//	int val;
//	ListNode* next;
//
//	ListNode(int x)
//		:val(x)
//		, next(nullptr)
//	{
//	}
//};
int main()
{
	ListNode* n1 = new ListNode(1);
	ListNode* n2 = new ListNode(1);
	ListNode* n3 = new ListNode(1);
	ListNode* n4 = new ListNode(1);

	n1->next = n2;
	n2->next = n3;
	n3->next = n4;


	return 0;
}

C++的动态内存管理方式new和 delete操作符进行动态内存管理。

cpp 复制代码
int main()
{
	//throw try/catch
	try 
	{
		void* p1 = new char[1024 * 1024 * 1024];
		cout << p1 << endl;

		void* p2 = new char[1024 * 1024 * 1024];
		cout << p2 << endl;

		void* p3 = new char[1024 * 1024 * 1024];
		cout << p3 << endl;
	}
	catch (const exception& e)
	{
		cout << e.what() << endl;
	}
	return 0;
}

2operator new和 operator dalete

1operator new

通过调用malloc来申请空间,malloc申请空间成功了以后,直接返回

申请失败以后,执行空间失败的应对措施,如果应对措施用户设置了,则继续申请。否则抛异常

2operator delete

最终也是通过free来释放内存的

3new和delete的实现原理

1 内置类型

如果申请的是内置类型的空间 new delete和malloc free 基本相似。

new 申请失败会抛异常malloc会返回null

new delete申请和删除的是单个元素的空间,而new[] delete[]申请和删除的是一段连续的空间

2自定义类型

1new的原理

1调用operator new函数申请空间

2在申请的空间上执行构造函数,完成对象的构造

2delete的原理

1在空间上执行析构函数,完成对象中资源的清理

2调用operator delete函数释放对象空间

3new[T]的原理

1调用operator new[ ] 函数 实际调用调用operator new完成对N个对象空间的申请

2在申请的空间上执行N次构造函数,完成对象的构造

4delete[T]的原理

1在释放的空间上执行N次析构函数,完成N个对象中资源的清理

2调用operator delete[ ]释放空间,实际在operator delete[ ]中调用operator delete来释放空间

cpp 复制代码
int main()
{
	int* p1 = new int;
	//free(p1);
	delete p1;



	return 0;
}
class B
{

private:
	int _b1 = 2;
	int _b2 = 2;
};
int main()
{
	B* p2 = new B[10];
	//free(p2);
	A* p3 = new A[10];



	delete[] p2;
	delete[] p3;
	//free(p3);
	return 0;
}

4malloc free 和 new delete的区别

共同点

:都是在堆上申请空间,都需要自己手动释放空间。

区别

1.前两个是函数,后两个是操作符

2malloc申请的空间不会初始化,new申请的空间会初始化

3malloc申请空间需要手动计算大小并传递,new只需后面跟上申请的类型。多个对象在[申请对象的个数]

4malloc申请空间的返回值是void* ,使用时必须强转,new不需要,new后面跟的就是空间类型。

5malloc申请失败,返回的是null,所以使用时必须判空。new不需要,但是new需要捕获异常

6申请自定义类型时,malloc和free只会申请和释放空间

new会申请资源用构造函数完成对象的初始化

delete会在释放空间之前调用析构函数完成空间中资源的清理

相关推荐
稚辉君.MCA_P8_Java8 小时前
DeepSeek Java 多线程打印的19种实现方法
java·linux·jvm·后端·架构
g***789112 小时前
Java语法进阶
java·开发语言·jvm
聊天QQ:2769988514 小时前
基于MPC模型预测控制的空调加热器温度调节系统研究:融合Kalman滤波的优化算法与实现
jvm
多多*14 小时前
Threadlocal深度解析 为什么key是弱引用 value是强引用
java·开发语言·网络·jvm·网络协议·tcp/ip·mybatis
2501_9418017617 小时前
Java高性能数据库操作实战:异步任务与多线程结合代码解析
jvm
用户849137175471618 小时前
Tomcat 为什么要“造反”?深度解析 Java 类加载机制的“守”与“破”
java·jvm
杀死那个蝈坦18 小时前
UV 统计(独立访客统计)
java·jvm·spring·kafka·tomcat·maven
野生技术架构师19 小时前
Java 经典面试题汇总:多线程 +spring+JVM 调优 + 分布式 +redis+ 算法
java·jvm·spring
酷ku的森19 小时前
JVM内存结构
jvm
他们都不看好你,偏偏你最不争气20 小时前
【iOS】数据持久化
jvm·数据库·macos·ios·oracle·objective-c·cocoa