malloc-free与new-delete的使用与应用

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申请类、结构体对象内存空间会自动调用构造、析构函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>