主要内存区间划分
  • :局部变量,数组(较小)
  • :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;
}

代码中各个数据开在哪?

  1. int a1 = 1:a1在静态区(全局变量)
  2. static int a2 = 2; a2在静态区(静态变量)
  3. static int b1 = 1; b1在静态区(静态变量)
  4. int num1[10] = { 1,2,3,4 }; num1在栈(局部变量)
  5. char arr1[] = "abcd"; arr1在栈(局部变量)
    • 注意:"abcd"在常量区,初始化会拷贝到arr1上
    • *arr1在栈(首元素地址解引用)
  6. const char* arr2 = "abcd"; arr2在栈(地址名,相当于变量)
    • *arr2在常量区(常量字符串首元素)
  7. 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次。因此,newdelete区别于malloc等的最大区别是:会自动调用构造、析构函数

初始化A数组

由于A有两个元素,因此不能直接像数组一样传3个值。
 

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐