1.C和C++内存分布
我们先来热身一下:
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在哪里?__C__ staticGlobalVar在哪里?__C__
staticVar在哪里?__C__ localVar在哪里?__A__
num1 在哪里?__A__
char2在哪里?__A__ *char2在哪里?_A__
pChar3在哪里?_A___ *pChar3在哪里?__D__
ptr1在哪里?__A__ *ptr1在哪里?__B__
2.C++内存管理方式
C++是兼容C的内存管理方式的,但是由于有不方便的地方。
于是C++提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理。
2.1 new/delete操作内置类型
new和delete都是操作符,不是函数。
new的常见使用方式:
1.动态申请一个int类型的空间
ptr1 = new int;
2.动态申请一个int类型的空间,并初始化为10
ptr2 = new int(10)
3.动态申请10个int类型的空间。
ptr3 = new int[10]
4.动态申请10个int类型的空间,并进行赋值。
ptr4 = new int[10]{1,2,3}
new不只是能申请 int类型,其他类型也是可以申请的。
动手练练:
int* p1 = new int;
int* p2 = new int[5];
int* p3 = new int(5);
int* p4 = new int[5]{1,2,3};
从内存空间的角度更容易看清楚一些。
delete:
释放单个空间:
delete ptr1
delete ptr2
释放多个空间:
delete[] ptr3
delete[] ptr4
delete p1;
delete[] p2;
delete p3;
delete[] p4;
注意:new []和delete[]一定要匹配,不然会报错
3.new和malloc最大的区别。(重点)
最大的区别在于 new在为自定义类型开辟空间的同时,会调用构造函数,delete会调用析构函数。而malloc只会开辟空间。
对于内置类型,new和malloc没有本质区别,只有用法上的区别。
只是new在用法上进行了简化。
但 new没有类似于 relloc之类的功能。
举个例子:
class A
{
public:
A():data(0)
{}
private:
int data;
};
int main()
{
A* A1 = (A*)malloc(sizeof(A));
A* A2 = new A;
return 0;
}
分别通过 malloc和new开辟空间。
通过下面的图可以看出,malloc开辟的空间并没有调用构造函数。
而new的话,是会调用构造函数的。
这也是new和malloc最本质的区别。
4.new与malloc报错的方式。
new报错的方式是不需要检查返回值,失败是抛异常。
而malloc报错的方式是返回NULL.
通常情况下 开辟空间不会失败,除非开辟空间很大(超过了最大值)