1.C++内存分布
2.C语言中动态内存管理方式
C语言中使用malloc/calloc/realloc
void Test()
{
int* p1 = (int*)malloc(sizeof(int));
free(p1);
int* p2 = (int*)calloc(4, sizeof(int));
int* p3 = (int*)realloc(p2, sizeof(int) * 10);
}
malloc/calloc/realloc函数的区别
1.malloc函数
函数原型:void* malloc (size_t size);
这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。如果开辟成功,则会返回一个指向开辟好空间的指针,开辟失败,则会返回一个NULL指针。
2.calloc函数
函数原型:void* calloc (size_t num, size_t size);
为num个大小为size的元素开辟一片空间,并且把每个字节初始化为零
3.realloc函数
函数原型:void* realloc (void* ptr, size_t size);
ptr为要调整的内存地址,size为调整之后新大小,返回值为调整之后的内存起始位置
3.C++中动态内存管理方式
C++兼容C的用法,但是C++提出了新的东西:new和delete
3.1.new和delete操作内置类型
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;
}
注意区分()和[ ]区别,前者为初始化,后者为开辟n个大小的空间
3.2.new和delete操作自定义类型
在申请自定义类型空间时,new会调用构造函数,delete会调用析构函数,malloc和free不会调用
4.operator new和operator delete函数
4.1operator new和malloc的区别?
operator new开空间失败抛异常,malloc返回0
下面我们使用代码来实现一下
简单定义一个类A
class A
{
public:
A(int a = 0)
:_a(a)
{
cout << "A()" << endl;
}
~A()
{
cout << "~A()" << endl;
}
private:
int _a;
};
写一段开辟空间的代码,size为无符号整型,如果为整型,会溢出
int main()
{
A* p1 = (A*)malloc(sizeof(A));
A* p2 = (A*)operator new(sizeof(A));
//malloc和operator new有什么区别
//使用方式都一样,处理错误方式不一样
size_t size = 2;
void* p3 = malloc(size*1024 * 1024 * 1024);
cout << p3 << endl; //失败返回0
try
{
void* p4 = operator new(size * 1024 * 1024 * 1024);
cout << p4 << endl; //失败抛异常(面向对象处理错误的方式)
}
catch (exception& e)
{
cout << e.what() << endl;
}
return 0;
}
4.2 operator delete和free的区别?
两者一样,没区别,失败直接终止进程
5.new和delete实现原理
5.1 内置类型
如果申请的是内置类型的空间,new和malloc,delete和free基本类似,不同的地方是:new/delete申请和 释放的是单个元素的空间,new[]和delete[]申请的是连续空间,而且new在申请空间失败时会抛异常, malloc会返回NULL。
5.2 自定义类型
new的原理
1. 调用operator new函数申请空间
2.在申请的空间上执行构造函数,完成对象的构造
delete的原理
1. 在空间上执行析构函数,完成对象中资源的清理工作
2. 调用operator delete函数释放对象的空间
new T[N]的原理
1. 调用operator new[]函数,在operator new[]中实际调用operator new函数完成N个对象空间的申 请
2. 在申请的空间上执行N次构造函数
delete[]的原理
1. 在释放的对象空间上执行N次析构函数,完成N个对象中资源的清理
2. 调用operator delete[]释放空间,实际在operator delete[]中调用operator delete来释放空间
operator new -> malloc+失败抛异常
new -> operator new+析构函数
补充:
6.内存泄露
什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不 是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而 造成了内存的浪费。
内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会 导致响应越来越慢,最终卡死。
如何在堆上一次申请4G的内存
将程序编译成X64的进程