看下面一段代码:
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);
}
再看分布图:
详情:
最后稍微 总结一下:
globalVar在-数据段(静态区)
staticGlobalVar在-数据段(静态区)
staticVar在-数据段(静态区)
localVar在-栈 num1 在-栈
char2在-栈 *char2在-栈
pChar3在-栈 *pChar3在-代码段(常量区)
ptr1在-栈 *ptr1在-堆
相对而言 * char2与* pChar3比较坑。
char2局部变量在栈区 char2是一个数组,把后面常量串拷贝过来到数组中,数组在栈上,所以*char2在栈上。
pChar3局部变量在栈区 *pChar3得到的是字符串常量字符在代码段。
sizeof(num1) = __40__;//数组大小,10个整形数据一共
40字节
sizeof(char2) = __5__;//包括\0的空间
strlen(char2) = __4__;//不包括\0的长度
sizeof(pChar3) = __4/8__;//pChar3为指针
strlen(pChar3) = __4__;//字符串“abcd”的长度,不包括
\0的长度
sizeof(ptr1) = __4/8__;//ptr1是指针
就这四种了malloc/calloc/realloc/free
先看一段代码:
void Test ()
{
int* p1 = (int*) malloc(sizeof(int));
free(p1);
int* p2 = (int*)calloc(4, sizeof (int));
int* p3 = (int*)realloc(p2, sizeof(int)*10);
free(p3 );
}
上面的p2内存泄漏了吗?简而言之就是p2没free 需要吗?
我先说答案,没有造成内存泄漏;因为p3释放的同时,p2也free了。
那么malloc/calloc/realloc的区别?
1. malloc分配的内存是位于堆中的,并且没有初始化内存的内容
,因此基本上malloc之后,调用函数memset来初始化这部分的内
存空间.
2. calloc则将初始化这部分的内存,设置为0.
3. realloc则对malloc申请的内存进行大小的调整;分为异地
扩和同地扩.
C语言内存管理方式在C++中可以继续使用,但有些地方就无能为力,而且使用起来比较麻烦,因 此C++又提出了自己的内存管理方式:通过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[],注意:匹配起来使用。
适合对自定义类型使用,而且new/delete 和 malloc/free最大区别是 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不会。
.
.
.
感觉有所收获的话,友友们给小丁一个赞👍