【C++初阶】2.深入解析C++内存管理与new/delete机制
先写一个有完整构造、析构函数的类:代码语言:javascriptAI代码解释class Apublic::_a1(a1),_a2(a2)cout << "普通构造" << endl;cout << "拷贝构造" << endl;cout << "拷贝" << endl;~A()cout << "析构" << endl;private:当我们用new开辟A类的空间后:代码语言:javascriptA
·
主要内存区间划分
- 栈:局部变量,数组(较小)
- 堆:malloc,new等开辟的空间(较大)
- 静态区(数据段):全局变量,静态数据
- 常量区(代码段):常量字符串
练习
代码语言:javascript
AI代码解释
#include<iostream>
using namespace std;
int a1 = 1;
static int a2 = 2;
int main()
{
static int b1 = 1;
int num1[10] = { 1,2,3,4 };
char arr1[] = "abcd";
const char* arr2 = "abcd";
int* num2 = (int*)malloc(sizeof(int) * 4);
free(num2);
return 0;
}
代码中各个数据开在哪?
int a1 = 1:a1在静态区(全局变量)static int a2 = 2;a2在静态区(静态变量)static int b1 = 1;b1在静态区(静态变量)int num1[10] = { 1,2,3,4 };num1在栈(局部变量)char arr1[] = "abcd";arr1在栈(局部变量)- 注意:
"abcd"在常量区,初始化会拷贝到arr1上 *arr1在栈(首元素地址解引用)
- 注意:
const char* arr2 = "abcd";arr2在栈(地址名,相当于变量)*arr2在常量区(常量字符串首元素)
int* num2 = (int*)malloc(sizeof(int) * 4);num2在栈(局部变量)*num2在堆(malloc开辟)
二.new和delete
和之前的nullptr一样,明明C语言已经有malloc之类的了,为什么还要加新的开辟与销毁指令呢?我们一步步往下看。
默认类型
代码语言:javascript
AI代码解释
int* p1 = new int;
int* p2 = new int[10];
delete p1;
delete[] p2;
可以创建、销毁数、数组,也可以初始化:
代码语言:javascript
AI代码解释
int* p3 = new int(1);
int* p4 = new int[10] {1, 2, 3, 4, 5};
delete p3;
delete[] p4;
可能在这里,C语言的realloc等也能做,那我们看看C++的独特的东西吧。
自定义类型
先写一个有完整构造、析构函数的类:
代码语言:javascript
AI代码解释
class A
{
public:
A(int a1 = 1, int a2 = 2)
:_a1(a1)
,_a2(a2)
{
cout << "普通构造" << endl;
}
A(const A& a)
{
_a1 = a._a1;
_a2 = a._a2;
cout << "拷贝构造" << endl;
}
A& operator=(const A& a)
{
_a1 = a._a1;
_a2 = a._a2;
cout << "拷贝" << endl;
return *this;
}
~A()
{
cout << "析构" << endl;
}
private:
int _a1 = 1;
int _a2 = 2;
};
当我们用new开辟A类的空间后:
代码语言:javascript
AI代码解释
A* a1 = new A[3];
delete[] a1;

编译器构造,并且析构了3次。因此,new和delete区别于malloc等的最大区别是:会自动调用构造、析构函数。
初始化A数组
由于A有两个元素,因此不能直接像数组一样传3个值。
更多推荐


所有评论(0)