C++一些注意点之new和malloc

整理了一下网上关于这个问题的见解。 

malloc/free和new/delete它们都可用于申请动态内存和释放内存,但是它们却有区别:

      (1)malloc与free是C++/C语言的内存分配标准库函数,属于stdlib库;new/delete是C++的操作运算符;

      (2)new 不止是分配内存,而且会调用类的构造函数,同理delete会调用类的析构函数,而malloc则只分配内存,不会进行初始化类成员的工作,同样free也不会调用析构函数;

例如:

  1. class Obj  
  2. {  
  3. public :  
  4.      Obj(void){ cout < < “Initialization” << endl; }  
  5.      ~Obj(void){ cout < < “Destroy” << endl; }  
  6.      void  Initialize(void){ cout < < “Initialization” << endl; }  
  7.      void  Destroy(void){ cout < < “Destroy” << endl; }  
  8.   
  9. };  
  10.   
  11.    
  12.   
  13. void UseMallocFree(void)  
  14. {  
  15.       Obj    *a = (obj *)malloc(sizeof(obj));     // 申请动态内存  
  16.       a->Initialize();                          // 初始化  
  17.       //…  
  18.       a->Destroy();     // 清除工作  
  19.       free(a);          // 释放内存  
  20. }  
  21.   
  22.    
  23.   
  24. void UseNewDelete(void)  
  25. {  
  26.       Obj    *a = new Obj;    // 申请动态内存并且初始化  
  27.       //…  
  28.       delete a;             // 清除并且释放内存  
  29. }  
  30.   
  31. 类Obj的函数Initialize模拟了构造函数的功能,函数Destroy模拟了析构函数的功能。函数UseMallocFree中,由于malloc/free不能执行构造函数与析构函数,必须调用成员函数Initialize和Destroy 来完成初始化与清除工作。函数UseNewDelete则简单得多。所以我们不要企图用malloc/free来完成动态对象的内存管理,应该用new/delete。  

 

          (3)内存泄漏对于malloc或者new都可以检查出来的,区别在于new可以指明是那个文件的那一行,而malloc没有这些信息。

            (4)返回类型不同:函数malloc 的原型为void * malloc(size_t size),用malloc 申请一块长度为length 的整数类型的内存,返回类型void类型指针(所以在使用malloc的时候你必须手动转换为相应的类型)。而new 返回指定类型的指针,并且可以自动计算所需要大小;

注:为什么free函数不象malloc函数那样复杂呢?这是因为指针p的类型以及它所指的内存的容量事先都是知道的,语句free(p)能正确地释放内存。如果pNULL指针,那么freep无论操作多少次都不会出问题。如果p不是NULL指针,那么freep连续操作两次就会导致程序运行错误。

例如:

  1. int *p;  
  2. p = new int//返回类型为int* 类型(整数型指针),分配大小为 sizeof(int);  
  3. 或:  
  4. int* parr;  
  5. parr = new int [100]; //返回类型为 int* 类型(整数型指针),分配大小为 sizeof(int) * 100;  
  6. 而 malloc 则必须由我们计算要字节数,并且在返回后强行转换为实际类型的指针。  
  7. int* p;  
  8. p = (int *) malloc (sizeof(int));//这里有两点需要注意:(1)必须自己手动转换;(2)必须用sizeof计算空间大小  
  9. //用malloc分配连续的空间  
  10. int* p = (int *) malloc ( sizeof(int) * 100 ); //分配可以放得下100个整数的内存空间。  

       (5)newmalloc虽然都是申请内存,但申请的位置不同,new的内存从free store分配,而malloc的内存从heap分配(详情请看ISO14882的内存管理部分),free storeheap很相似,都是动态内存,但是位置不同,这就是为什么new出来的内存不能通过free来释放的原因。不过微软编译器并没有很好的执行标准,很有可能把free storeheap混淆了,因此,free有时也可以;

    (6)new是类型安全的,而malloc不是。

例如:

  1. int* p = new float[2]; // 编译时指出错误   
  2. int* p = malloc(2*sizeof(float)); // 编译时无法指出错误   
  3. new operator 由两步构成,分别是 operator new 和 construct   


几个注意点:

        (1)把newdeletemallocfree混在一起用也是个坏想法。对一个用new获取来的指针调用free,或者对一个用malloc获取来的指针调用delete,其后果是不可预测的;

        (2)delete数组的时候忘了 “[ ]”,容易遗漏对象,造成内存泄露;

        (3)malloc申请空间时,不对空间进行检查,造成不可预料的错误。

        (4)如果用new 创建对象数组,那么只能使用对象的无参数构造函数。即没有默认构造函数的类,不能用new来创建数组。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值