目录
一、知识点考察
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";
const char* 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. 选择题:
选项 : A.栈 B.堆 C.数据段(静态区) D.代码段(常量区)
globalVar在哪里?____ staticGlobalVar在哪里?____
staticVar在哪里?____ localVar在哪里?____
num1 在哪里?____
ptr1在哪里?____ *ptr1在哪里?____
char2在哪里?____ *char2在哪里?___
pChar3在哪里?____ *pChar3在哪里?____2. 填空题:
sizeof(num1) = ____;
sizeof(char2) = ____;
sizeof(pChar3) = ____;
sizeof(ptr1) = ____;
strlen(char2) = ____;
strlen(pChar3) = ____
3. sizeof 和 strlen 区别?
提示:
- 栈区:程序运行时由编译器自动分配,存放函数的参数值、局部变量的值。
- 堆区:在内存开辟另一块存储区域。一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。存储开辟空间时相应数据类型的数据。
- 数据段(静态区、全局区):编译器编译时即分配内存。全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量(static)在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 程序结束后由系统释放。
- 代码段(只读区、常量区):常量区:常量字符串就是放在这里的。程序结束后由系统释放。程序代码区:存放函数体的二进制代码。
答案将在下期揭晓~
二、C++内存管理方式
C语言内存管理方式在C++中可以继续使用,但有些地方就无能为力,而且使用起来比较麻烦,因此C++又提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理(C语言动态管理使用的是函数)。
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;
}
注意:申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用 new[ ]和delete[ ],注意:请匹配起来使用,不可将其与C语言的动态管理函数混搭,然后请注意delete[ ]的使用方法,[ ]中是不需要传删除的个数的,且[ ]紧跟在delete后面。
2.new/delete操作自定义类型
class A
{
public:
A(int a = 0): _a(a)
{
cout << "A():" << this << endl;
}
~A()
{
cout << "~A():" << this << endl;
}
private:
int _a;
};
int main()
{
// new/delete 和 malloc/free最大区别是 new/delete对于[自定义类型]除了开空间还会调用构造函数和析构函数
A* p1 = (A*)malloc(sizeof(A));
A* p2 = new A(1);
free(p1);
delete p2;
// 内置类型是几乎是一样的
int* p3 = (int*)malloc(sizeof(int)); // C
int* p4 = new int;
free(p3);
delete p4;
A* p5 = (A*)malloc(sizeof(A) * 10);
A* p6 = new A[10];
free(p5);
delete[] p6;
return 0;
}
注意:在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc(及其家族)与 free不会。