-
C/C++中程序内存区域划分
- 内核空间(用户代码不能读写)
- 栈(函数中存放的变量)
- 内存映射段
- 堆(重点)
- 数据段(静态区)全局变量 / 静态变量
- 代码段(常量区)
试分析下列代码
int globalVar = 1;// 这个变量globalVar 存放在静态区(原因:globalVar是全局变量)
static int staticGlobalVar = 1;//静态区 是静态变量
void Test()
{
static int staticVar = 1;//静态区,静态变量
int localVar = 1;// 栈区
int num1[10] = {1, 2, 3, 4};//num1存放在栈区,*num1存放在栈区
char char2[] = "abcd";//char2存放在栈区,*char2存放在栈区
这段代码是将"abcd"拷贝下来,开辟空间,放置在栈区
const char* pChar3 = "abcd";//PChar3存放在栈区,*pChar3存放在常量区
//这里解释一下pChar3 pChar3是const char* ,所指向的内容不能被修改
这段代码可以说明s存放的位置与t存放的位置一样
int* ptr1 = (int*)malloc(sizeof (int)*4);//ptr1存放在栈区,*ptr1存放在堆区
int* ptr2 = (int*)calloc(4, sizeof(int));//与上面同理
int* ptr3 = (int*)realloc(ptr2, sizeof(int)*4);//与上面同理
free (ptr1);
free (ptr3);
}
-
C++中的new和delete(操作符)
C语言向堆上申请空间,使用malloc realloc calloc申请空间,放回首地址
C++使用new申请堆上的空间,返回首地址
new的好处
- 简洁
- 可以控制初始化
- 对于自定义类型,自动调构造函数
- 申请失败,会抛异常,无需手动检查
申请内置类型
#include<iostream>
using namespace std;
int main()
{
int* t = new int(1);//申请一个整形,并且将这个整形赋值为1
cout << *t << endl;
delete t;//释放这块空间
return 0;
}
申请内置类型数组
#include<iostream>
using namespace std;
int main()
{
int* arr = new int[10] { 1 };//申请10个整形的空间,第一个值赋为1,其余赋为0
delete[] arr;//释放空间
return 0;
}
申请自定义类型
下面演示抛异常:
#include <iostream>
using namespace std;
void func()
{
while (1)
{
int* temp = new int[1024 * 1024 * 100];
cout << temp << endl;
}
}
int main()
{
try
{
func();
}
catch (const exception& e)
{
cout << e.what() << endl;
}
return 0;
}