1. 内存分区
在C++中内存分为5个区,分别是栈区
、堆区
、全局/静态存储区
和 代码|常量存储区
、 共享内存区
。
-
栈区:英文是 stack,在内存管理的语境下,指的是函数调用过程中产生的本地变量和调用数据的区域,存储非静态局部变量、临时对象、函数参数、 返回值等。满足“后进先出”(last-in-first-out 或 LIFO)。
-
堆区:英文是 heap,在内存管理的语境下,程序运行时动态分配内存的区域。关键字
new
开辟的空间都在堆区 -
静态区:存储全局数据和静态数据
-
代码区:存储可执行的代码、只读常量
-
共享内存区:用于进程之间进行间通讯
2. new 和 delete
在 c++ 中 , 如果要在堆内存中申请空间,那么需要借助 new
操作符,释放申请的空间,使用 delete
操作 。而 c 语言使用的是malloc
和free
。
C++ 中的自由存储区,英文是 free store,特指使用 new 和 delete 来分配和释放内存的区域。一般而言,这是堆的一个子集:
但 new 和 delete 通常底层使用 malloc 和 free 来实现,所以 free store 也是 heap。
2.1 new
代码展示:
#include <string>
using namespace std;
class A{
public:
A(){
puts("A 构造 ...");
}
~A(){
puts("A 析构 ~~~");
}
};
int main() {
A * a = new A;
return 0;
}
运行结果:
A 构造 ...
2.2 delete
在c++中,delete
和new
是成对出现的,所以就有了no new no delete
的说法。delete
用于释放new
申请的内存空间。 delete
的操作具备以下几个特征:
代码:
int main() {
int * i = nullptr ;
delete i;
A * a = new A;
delete a;
delete a; //会报错
return 0;
}
3. malloc 和 free
3.1 malloc
代码展示:
#include <iostream>
#include <string>
using namespace std;
class A{
public:
A(){
cout <<"A 构造 ..." <<endl;
}
~A(){
cout <<"A 析构 ~~~" <<endl;
}
};
void fo(A * aa ){
A a;
*aa = a;
}
int main() {
int * a0 = new int(12);
int * a1 = (int*)malloc(sizeof(int)); //函数原型: void *__cdecl malloc(size_t _Size);
*a1 = 24;
cout << "a0 : " << *a0 << " ; a1 : " << *a1 << endl;
A * aa = (A*)malloc(sizeof(A));
cout <<"-------------------" <<endl;
//再创建对象,然后再存到空间里面去。
fo(aa);
cout <<"-------------------" <<endl;
return 0;
}
运行结果:
a0 : 12 ; a1 : 24
-------------------
A 构造 ...
A 析构 ~~~
-------------------
3.2 free
int main() {
int * a0 = new int(12);
int * a1 = (int*)malloc(sizeof(int)); //函数原型: void *__cdecl malloc(size_t _Size);
*a1 = 24;
cout << "a0 : " << *a0 << " ; a1 : " << *a1 << endl;
A * aa = (A*)malloc(sizeof(A));
cout <<"-------------------" <<endl;
//再创建对象,然后再存到空间里面去。
fo(aa);
cout <<"-------------------" <<endl;
//释放空间
free(a1);
free(aa);
//free(aa);//重复释放,报错
return 0;
}
运行结果:
a0 : 12 ; a1 : 24
-------------------
A 构造 ...
A 析构 ~~~
-------------------