C++中new出得对象与C中的malloc出得有啥联系和区别?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++中new出得对象与C中的malloc出得有啥联系和区别?相关的知识,希望对你有一定的参考价值。

回答请求:
请从内存分配方面解答,谢谢!

1、new 是c++中的操作符,malloc是c 中的一个函数

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

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

4、new 和 malloc效率比较

new 有三个字母, malloc有六个字母

new可以认为是malloc加构造函数的执行。

new出来的指针是直接带类型信息的。

而malloc返回的都是void指针。

一:new delete 是运算符,malloc,free是函数

malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。

对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。

因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。

我们先看一看malloc/free和new/delete如何实现对象的动态内存管理,见示例。

class Obj



public :

Obj(void) cout << “Initialization” << endl;

~Obj(void) cout << “Destroy” << endl;

void Initialize(void) cout << “Initialization” << endl;

void Destroy(void) cout << “Destroy” << endl;

;

void UseMallocFree(void)



Obj *a = (obj *)malloc(sizeof(obj)); // 申请动态内存

a->Initialize(); // 初始化

//…

a->Destroy(); // 清除工作

free(a); // 释放内存



void UseNewDelete(void)



Obj *a = new Obj; // 申请动态内存并且初始化

//…

delete a; // 清除并且释放内存



示例用malloc/free和new/delete如何实现对象的动态内存管理

类Obj的函数Initialize模拟了构造函数的功能,函数Destroy模拟了析构函数的功能。函数UseMallocFree中,由于malloc/free不能执行构造函数与析构函数,必须调用成员函数Initialize和Destroy来完成初始化与清除工作。函数UseNewDelete则简单得多。

所以我们不要企图用malloc/free来完成动态对象的内存管理,应该用new/delete。由于内部数据类型的“对象”没有构造与析构的过程,对它们而言malloc/free和new/delete是等价的。

既然new/delete的功能完全覆盖了malloc/free,为什么C++不把malloc/free淘汰出局呢?这是因为C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。

如果用free释放“new创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。如果用delete释放“malloc申请的动态内存”,理论上讲程序不会出错,但是该程序的可读性很差。所以new/delete必须配对使用,malloc/free也一样。

二:new delete在实现上其实调用了malloc,free函数。

三:new operator除了分配内存,还要调用构造函数。

malloc函数只是负责分配内存
参考技术A 详细的可以参考《高质量C++编程一书》。
我给你简单说要点:
1、new是对malloc的封装,你可以这么认为。
2、为何要用new?因为c++引入了类,类都要初始化,所谓的构造函数是也。malloc支持的是对堆内存的分配,是按大小来的,比如分100字节。但malloc没法完成类的初始化,类的对象实例里面有很多数据成员,分配和初始化方式多样,很难按照字节自己分配和初始化,这就需要你自己定义构造函数。然后new只是负责给你调用,这样分配和初始化对象。

给你摘一段看看:
malloc 与 free 是 C++/C 语言的标准库函数,new/delete 是 C++的运算符。它们都可
用于申请动态内存和释放内存。
对于非内部数据类型的对象而言,光用 maloc/free 无法满足动态对象的要求。对象
在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于
malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数
和析构函数的任务强加于 malloc/free。
因此 C++语言需要一个能完成动态内存分配和初始化工作的运算符 new,以及一个
能完成清理与释放内存工作的运算符 delete。注意 new/delete 不是库函数。

详细看《高质量C++编程一书》,我就不给你复制了。很小的200多k,参考资料里面是下载地址。

祝好运!

参考资料:http://ishare.iask.sina.com.cn/f/5666379.html?from=isnom

参考技术B 1、new 是c++中的操作符,malloc是c 中的一个函数
2、new 不止是分配内存,而且会调用类的构造函数,同理delete会调用类的析构函数,而malloc则只分配内存,不会进行初始化类成员的工作,同样free也不会调用析构函数
3、内存泄漏对于malloc或者new都可以检查出来的,区别在于new可以指明是那个文件的那一行,而malloc没有这些信息。
4、new 和 malloc效率比较
new可以认为是malloc加构造函数的执行。
new出来的指针是直接带类型信息的。
而malloc返回的都是void指针。
参考技术C void *malloc(int size);   说明:malloc 向系统申请分配指定size个字节的内存空间。返回类型是 void* 类型。void* 表示未确定类型的指针。C,C++规定,void* 类型可以强制转换为任何其它类型的指针。   从函数声明上可以看出。malloc 和 new 至少有两个不同: new 返回指定类型的指针,并且可以自动计算所需要大小。比如:   int *p;   p = new int; //返回类型为int* 类型(整数型指针),分配大小为 sizeof(int);   或:   int* parr;   parr = new int [100]; //返回类型为 int* 类型(整数型指针),分配大小为 sizeof(int) * 100;   而 malloc 则必须由我们计算要字节数,并且在返回后强行转换为实际类型的指针。   int* p;   p = (int *) malloc (sizeof(int));   第一、malloc 函数返回的是 void * 类型。对于C++,如果你写成:p = malloc (sizeof(int)); 则程序无法通过编译,报错:“不能将 void* 赋值给 int * 类型变量”。所以必须通过 (int *) 来将强制转换。而对于C,没有这个要求,但为了使C程序更方便的移植到C++中来,建议养成强制转换的习惯。   第二、函数的实参为 sizeof(int) ,用于指明一个整型数据需要的大小。如果你写成:   int* p = (int *) malloc (1);   代码也能通过编译,但事实上只分配了1个字节大小的内存空间,当你往里头存入一个整数,就会有3个字节无家可归,而直接“住进邻居家”!造成的结果是后面的内存中原有数据内容被改写。   malloc 也可以达到 new [] 的效果,申请出一段连续的内存,方法无非是指定你所需要内存大小。   比如想分配100个int类型的空间:   int* p = (int *) malloc ( sizeof(int) * 100 ); //分配可以放得下100个整数的内存空间。   另外有一点不能直接看出的区别是,malloc 只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中,其值将是随机的。   除了分配及最后释放的方法不一样以外,通过malloc或new得到指针,在其它操作上保持一致。   对其做一个特例补充   char *ptr;   if ((ptr = (char *)malloc(0)) == NULL)   puts("Got a null pointer");   else   puts("Got a valid pointer");   此时得到的是Got a valid pointer。把0赋给malloc能得到一个合法的指针。 参考技术D 简单的来讲堆(heap)上分配的内存,系统不释放,而且是动态分配的。栈(stack)上分配的内存系统会自动释放,它是静态分配的。运行时栈叫堆栈。栈的分配是从内存的高地址向低地址分配的,而堆则相反。
由malloc或new分配的内存都是从heap上分配的内存,从heap上分配的内存必须有程序员自己释放,用free来释放,否则这块内存会一直被占用而得不到释放,就出现了“内存泄露(Memory Leak)”。这样会造成系统的可分配内存的越来越少,导致系统崩溃。
所以说他们本来就是一脉相承的,malloc出来的要free,这两个都是C中的函数,而new出得要由delete来释放,所以说,他们是一样的作用不一样的姓名和血统。本回答被提问者采纳

C++中的new VS C语言中的malloc

作者:gnuhpc 
出处:http://www.cnblogs.com/gnuhpc/

前几天一个朋友去面试百度空间的一个职位,被问及这个问题,我听后说了几点,不过感觉还是不透彻,所以上网查阅了一些资料,自己又想了想,总结一下。

  • 动作不同:
    • 在C++中,new一个对象时,程序完成对象的空间的分配的同时,构造函数也被调用,类似,delete一个对象时,对象的空间被释放的同时析构函数也被调用。
    • 在C中,malloc和free 则没有构造函数和析构函数被调用这个动作。当然,在没有特定的构造函数或析构函数时,C++也没有这个动作。
  • 关于重载:
    • 在C++中,对于任何非数组的空间分配,我们可以通过定义函数名相同但参数不同的构造函数完成对构造函数的重载,而对于数组的空间分配,就只能使用默认构造函数了,若你试图去开辟一个没有默认构造函数的数组,Compiler会出错。
    • 在C中,自然是没有重载这个事情了。
  • 返回值不同:
    • 在C中,malloc返回一个void *指针,需要你强制指针类型转换
    • 在C++中,你直接new一个就好。
      • 注意,对于基本类型,这个差别是二者唯一的差别,当然不建议在C++中使用malloc+强制类型转换创建基本数据类型或者对象。
  • 定义不同:
    • new是操作符
    • malloc是函数
  • 异常处理方式不同:
    • new抛出异常
    • malloc返回NULL
  • 分配空间单位不同:
    • new分配单位为对象所占用空间的倍数。
    • malloc为字节

使用提示:

1.delete使用不当会造成内存泄露,下边的这个例子就是只有第一个t被释放掉:

Test* t = new Test[3]; 
delete t;

而下列代码会导致堆崩溃或数据丢失。

Test* t = new Test; 
delete[] t; // <-- This is even worse

2.realloc只能用于malloc。C++中你只能重新开辟空间、复制、释放原来空间来完成相同的操作。

3.性能区别,根据http://code.dawnofthegeeks.com/2009/05/04/fyi-new-vs-malloc/ 其中提到malloc/free慢于new/delete,但是在后来笔者开发的一个程序中却出现了不同的场景。

 

转:http://www.cnblogs.com/gnuhpc/archive/2012/12/10/2811943.html

以上是关于C++中new出得对象与C中的malloc出得有啥联系和区别?的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中,数组分配的 new 和 new[] 有啥区别

C++中的new VS C语言中的malloc

C/C++——C++中new与malloc的10点区别

C++ malloc 与 new 的区别

C++ malloc 与 new 的区别

Malloc 和 new 运算符分配内存有啥区别? [复制]