malloc-free
- C语言使用malloc-free动态申请、释放堆区空间,使用的时候需要显示的指定申请空间的大小。
- 函数原型:void *malloc(size_t size),分配所需的内存空间,并返回一个指向它的指针
- 参数size:内存块的大小,以字节为单位
- 返回值:返回一个指针,指向已分配大小的内存。如果请求失败,则返回NULL;
- 函数原型: void free(void *ptr) 释放之前调用 calloc、malloc 或 realloc 所分配的内存空间。
- 参数ptr:指针指向要释放的内存块,该内存块之前是通过malloc进行分配内存的。如果传递的是一个空指针,则不会执行任何操作。
- 返回值:没有返回值
- 不能对申请的空间进行初始化
//malloc-free的使用 int *p = (int*)malloc(sizeof(int)); //原型是void*,使用时需要转换成自己需要的类型 free(p); p = NULL; //指针需要赋空,避免野指针 //malloc动态申请数组并初始化 int num = 3; cin >> num; int* p = (int*)malloc(num*sizeof(int)); //给申请得空间初始化 for (int i = 0; i < num; i++) { p[i] = num + i; } for (int i = 0; i < num; i++) { cout << p[i] << " "; } free(p); p = nullptr;new-delete
- C++使用new、delete 关键字来动态申请、释放堆区的空间
- new申请空间不需要指定大小,而是指定类型,然后根据类星星自动计算所需的空间大小,并返回申请内存空间的地址,地址指向的类型是new后写的类型
- new申请空间的格式:type*ptr = new type
- 申请空间的同时可以初始化:int *a = new int(10);
- delete回收的是指针指向的内存空间,同一块空间不需要重复释放,除非指针已经被赋空,对空指针使用delete是安全的。栈区的内存空间不能使用delete来释放。
//new申请二维数组 //有两种方法,这两种方法是等价的 //1. int(*p)[10] = new int[5][10]; //2.ii int**p = new int*[5]; for(int i=0;i<5;i++) { p[i] = new int[10]; } //注意:内存空间的划分是5行10列,但是p的维度是按照列划,而不是按照行声明 //new-delete的使用 //申请char类型的空间并初始化 char* p2 = new char{ 'A' }; delete p2; p2 = NULL; //申请char型数组 char* p3 = new char[3]{ "ab" };//字符串后边右隐藏的\0,考虑\0的大小 往字符数组中写入有两种方式 char* p3 = new char[3]{ 'a','b','\0' };//一定要有\0,否则会越界 delete []p3; p3 = NULL; //整型指针空间 /int** p4 = new int* ; delete p4; p4 = NULL; //整型指针数组、整型数组的指针、二维数组注意:
- new数组返回的是首元素的首地址
- new申请空间的同时可以初始化
- 对于数组空间回收,在指针前一般加上[ ],代表回收整个数组的空间,即使回收二维数组也只写一个[ ]即可,且[ ]里面不准写数字。
- new的三个功能:1.分配动态对象所需要的内存 2.调用构造函数来构造对象 3.返回正确的指针
new在类中的使用
new创建类对象的特点:
- new创建类对象需要指针接受,一旦初始化,可以多处使用
- new创建类对象使用完需delete销毁,不是必须配套使用的
- new创建对象直接使用堆区空间,而局部不用new定义类对象则使用占空间
- new对象指针用途广泛,比如作为函数返回值、函数参数等
- 频繁调用场合并不适和new,就像new申请和释放内存一样,会导致内存泄漏
//C++类中实例化的两种方式
A a; 在栈区创建一个类对象
A* a = new a(); 在堆区创建一个类对象,new会自动调用构造函数,进行初始化
//1.new创建类对象的例子
CTest* pTest = new CTest();//括号可以省略
delete pTest;
//其中pTest用来接收类对象指针。new申请的对象,只有调用到delete的时候才会执行析构函数,如果让程
//序直接退出不执行delete会导致内存泄漏
//2.只定义类指针
CTest* pTest = NULL;
//类指针可以先行定义,但是类指针只是一个通用指针,在new之前为该类对象分配任何内存空间
//new出来的对象,在创建之初就在栈区分配了内存空间
//类指针如果没有经过对象的初始化,就不需要delete释放
//3.不用new创建类对象实例,直接使用类定义声明
CTest mTest;//使用完后不需要释放,会自动调用析构函数
malloc-free与new-delete的区别
- malloc-free是函数,需要头文件支持;new-delete是关键字,需要C++编译器支持
- malloc需要显式指定申请空间的大小,返回的是void*,需要强转成我们自己需要的类型
new不需要显式指定申请空间的大小,可以根据类型自动计算,返回的是申请类型的指针,不需要强转 - malloc申请空间手动赋值,new申请空间的同时可以初始化
- malloc-free不会自动的调用构造析构函数
new-delete申请类、结构体对象内存空间会自动调用构造、析构函数
944

被折叠的 条评论
为什么被折叠?



