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函数只是负责分配内存
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-08-14
详细的可以参考《高质量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

第2个回答  2011-08-14
1、new 是c++中的操作符,malloc是c 中的一个函数
2、new 不止是分配内存,而且会调用类的构造函数,同理delete会调用类的析构函数,而malloc则只分配内存,不会进行初始化类成员的工作,同样free也不会调用析构函数
3、内存泄漏对于malloc或者new都可以检查出来的,区别在于new可以指明是那个文件的那一行,而malloc没有这些信息。
4、new 和 malloc效率比较
new可以认为是malloc加构造函数的执行。
new出来的指针是直接带类型信息的。
而malloc返回的都是void指针。
第3个回答  2011-08-14
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能得到一个合法的指针。
第4个回答  2011-08-14
简单的来讲堆(heap)上分配的内存,系统不释放,而且是动态分配的。栈(stack)上分配的内存系统会自动释放,它是静态分配的。运行时栈叫堆栈。栈的分配是从内存的高地址向低地址分配的,而堆则相反。
由malloc或new分配的内存都是从heap上分配的内存,从heap上分配的内存必须有程序员自己释放,用free来释放,否则这块内存会一直被占用而得不到释放,就出现了“内存泄露(Memory Leak)”。这样会造成系统的可分配内存的越来越少,导致系统崩溃。
所以说他们本来就是一脉相承的,malloc出来的要free,这两个都是C中的函数,而new出得要由delete来释放,所以说,他们是一样的作用不一样的姓名和血统。本回答被提问者采纳

C++中new出得对象与C中的malloc出得有什么联系和区别?
1、new 是c++中的操作符,malloc是c 中的一个函数 2、new 不止是分配内存,而且会调用类的构造函数,同理delete会调用类的析构函数,而malloc则只分配内存,不会进行初始化类成员的工作,同样free也不会调用析构函数 3、内存泄漏对于malloc或者new都可以检查出来的,区别在于new可以指明是那个文件的那...

new和malloc的区别与联系
1、申请的内存所在位置不同。new操作符从自由存储区(free store)上为对象动态分配内存空间。自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。malloc函数从堆上动态分配内存。堆是操作系统中的术语,是操作系统所维护的一块特殊内存,用于程序的内存动...

关于C++ new和malloc的区别,记住这张表格就行了!
new和malloc的主要区别在于属性、使用、内存位置、返回类型、分配失败情况和定义对象系统调度过程等方面。new是C++中的关键字,用于在运行时分配内存,分配成功时返回与对象类型匹配的指针,不需要进行类型转换。malloc是C语言中的库函数,用于在堆上分配内存,返回void*类型的指针,需要通过强制类型转换来使用。

new和malloc区别
总的来说,malloc和new的区别在于它们所使用的内存区域和对象的创建方式不同。在选择使用哪种内存分配方式时,需要根据具体的编程语言和需求来决定。同时,需要注意内存的释放和管理,避免内存泄漏和野指针等问题。

C语言中的malloc和C++中new的区别
new是C++的运算符 malloc是C的函数。所以从效率上来说 new的效率更高。另外,在对象操作上,new会调用构造函数,而malloc只是单纯分配内存。所以 在C++对象申请中,必须用new而不是malloc

new和malloc的区别
新运算符与malloc是C++与C语言中用于动态内存分配的两种主要方式。它们在内存区域、重载、自定义类型、分配成功、返回类型、参数与属性上存在差异,理解这些差异对于程序设计具有重要意义。内存区域方面,new操作符从自由存储区动态分配内存,而malloc函数从操作系统维护的堆上分配。自由存储区是new操作符作用的...

经典面试题之new和malloc的区别
特别地,new可以预先指定内存起始区域,用于对象初始化并返回地址,而malloc不允许重载。new操作符从自由存储区分配内存,而malloc从堆上动态分配内存。自由存储区是C++中new操作符的抽象概念,用于描述通过new操作符申请的内存区域。堆是操作系统管理的一块特殊内存区域,用于程序进行动态内存分配与释放。

C++中,new\/delete和malloc\/free的区别
1、new\/delete是C++的操作符,而malloc\/free是C中的函数。2、new做两件事,一是分配内存,二是调用类的构造函数;同样,delete会调用类的析构函数和释放内存。而malloc和free只是分配和释放内存。3、new建立的是一个对象,而malloc分配的是一块内存;new建立的对象可以用成员函数访问,不要直接访问它...

new与malloc的区别以及实现方法
new和malloc内部实现的区别是什么?new的实现分为两步:1. 调用operator new()分配内存,如果内存不足则失败并抛出异常;2. 如果需要的话,在那段内存上初始化对象(赋值或调用构造函数),这是由编译器根据代码来控制的。因此,new和malloc检查是否正确分配的方法不同。为了照顾原来习惯的程序员,C++...

C++中new和mallow 什么区别? 稍微详细点,谢谢
malloc与free是C++\/C语言的标准库函数,new\/delete是C++的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用maloc\/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc\/free是库函数而不是运算符,不在编译器...

相似回答