目录
3.3 new、delete、newT[]和delete[]的原理
1. C++内存区域的划分
1、栈又叫堆栈——非静态局部变量/函数参数/返回值等等,栈是向下增长的。
2、内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存,做进程间通信。
3、堆用于程序运行时动态内存分配,堆是向上增长的。
4、数据段——存储全局数据和静态数据。
5、代码段——可执行的代码/只读常量。
2. 常见变量的存储区域
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";//栈区,*char2在栈区
const char* pChar3 = "abcd";//指针在栈区,*pchar3在常量区
int* ptr1 = (int*)malloc(sizeof(int) * 4);//指针在栈区,*ptr1在堆区
int* ptr2 = (int*)calloc(4, sizeof(int));///栈区
int* ptr3 = (int*)realloc(ptr2, sizeof(int) * 4);//栈区
free(ptr1);
free(ptr3);
}
3. new和delete
3.1 new和deleted的使用
int main()
{
int* p1 = new int;//在堆区申请一个int大小的空间,不会初始化
int* p2 = new int(0);//申请并初始化为0
delete p1;
delete p2;
int* p3 = new int[10];//在堆区申请一块10个int大小的空间,未初始化
int* p4 = new int[10]{ 1,2,3};//初始化为{1,2,3,0,0,0,0,0,0,0}
delete[] p3;
delete[] p4;
return 0;
}
注意:申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用new[]和delete[],一定要匹配起来使用!!!
3.2 malloc/free与new/delete的区别
malloc/free和new/delete的共同点是:都是从堆上申请空间,并且需要用户手动释放。不同的地方是:1. malloc和free是函数,new和delete是操作符2. malloc申请的空间不会初始化,new可以初始化3. malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可, 如果是多个对象,[]中指定对象个数即可