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

作者&投稿:貂试 (若有异议请与网页底部的电邮联系)
c++中new和malloc有哪些区别,变量分配的空间有什么区别吗?~

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

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

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

4,C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存

  new 是个操作符,和什么"+","-","="……有一样的地位。

  malloc是个分配内存的函数,供你调用的。

  new是保留字,不需要头文件支持。

  malloc需要头文件库函数支持。

  new 建立的是一个对象,

  malloc分配的是一块内存。

  new建立的对象你可以把它当成一个普通的对象,用成员函数访问,不要直接访问它的地址空间

  malloc分配的是一块内存区域,就用指针访问好了,而且还可以在里面移动指针。

  简而言之:

  new 是一个操作符,可以重载

  malloc是一个函数,可以覆盖

  new 初始化对象,调用对象的构造函数,对应的delete调用相应的析构函数

  malloc仅仅分配内存,free仅仅回收内存

malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存2.对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。3.因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。 4.C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。 5.new可以认为是malloc加构造函数的执行。new出来的指针是直接带类型信息的。而malloc返回的都是void*指针。new delete在实现上其实调用了malloc,free函数6.new建立的对象你可以把它当成一个普通的对象,用成员函数访问,不要直接访问它的地址空间;malloc分配的是一块内存区域,就用指针访问好了,而且还可以在里面移动指针.7.new 建立的是一个对象;malloc分配的是一块内存.***************************************相同点:都可用于申请动态内存和释放内存不同点: (1)操作对象有所不同。 malloc与free是C++/C 语言的标准库函数,new/delete 是C++的运算符。对于非内部数据类的对象而言,光用maloc/free 无法满足动态对象的要求。对象在创建的同时要自动执行构造函数, 对象消亡之前要自动执行析构函数。由于malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加malloc/free。(2)在用法上也有所不同。 函数malloc 的原型如下: void * malloc(size_t size); 用malloc 申请一块长度为length 的整数类型的内存,程序如下: int *p = (int *) malloc(sizeof(int) * length); 我们应当把注意力集中在两个要素上:“类型转换”和“sizeof”。 malloc 返回值的类型是void *,所以在调用malloc 时要显式地进行类型转换,将void * 转换成所需要的指针类型。 malloc 函数本身并不识别要申请的内存是什么类型,它只关心内存的总字节数。函数free 的原型如下: void free( void * memblock ); 为什么free 函数不象malloc 函数那样复杂呢?这是因为指针p 的类型以及它所指的内存的容量事先都是知道的,语句free(p)能正确地释放内存。如果p 是NULL 指针,那么free对p 无论操作多少次都不会出问题。如果p 不是NULL 指针,那么free 对p连续操作两次就会导致程序运行错误。new/delete 的使用要点 运算符new 使用起来要比函数malloc 简单得多,例如: int *p1 = (int *)malloc(sizeof(int) * length); int *p2 = new int[length]; 这是因为new 内置了sizeof、类型转换和类型安全检查功能。对于非内部数据类型的对象而言,new 在创建动态对象的同时完成了初始化工作。如果对象有多个构造函数,那么new 的语句也可以有多种形式。如果用new 创建对象数组,那么只能使用对象的无参数构造函数。例如 Obj *objects = new Obj[100]; // 创建100 个动态对象 不能写成 Obj *objects = new Obj[100](1);// 创建100 个动态对象的同时赋初值1 在用delete 释放对象数组时,留意不要丢了符号‘[]’。例如 delete []objects; // 正确的用法 delete objects; // 错误的用法 后者相当于delete objects[0],漏掉了另外99 个对象。***************************************1 new自动计算需要分配的空间,而malloc需要手工计算字节数 2 new是类型安全的,而malloc不是,比如: int* p = new float[2]; // 编译时指出错误 int* p = malloc(2*sizeof(float)); // 编译时无法指出错误 new operator 由两步构成,分别是 operator new 和 construct 3 operator new对应于malloc,但operator new可以重载,可以自定义内存分配策略,甚至不做内存分配,甚至分配到非内存设备上。而malloc无能为力 4 new将调用constructor,而malloc不能;delete将调用destructor,而free不能。 5 malloc/free要库文件支持,new/delete则不要。

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函数只是负责分配内存

详细的可以参考《高质量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,参考资料里面是下载地址。

祝好运!

1、new 是c++中的操作符,malloc是c 中的一个函数
2、new 不止是分配内存,而且会调用类的构造函数,同理delete会调用类的析构函数,而malloc则只分配内存,不会进行初始化类成员的工作,同样free也不会调用析构函数
3、内存泄漏对于malloc或者new都可以检查出来的,区别在于new可以指明是那个文件的那一行,而malloc没有这些信息。
4、new 和 malloc效率比较
new可以认为是malloc加构造函数的执行。
new出来的指针是直接带类型信息的。
而malloc返回的都是void指针。

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能得到一个合法的指针。

简单的来讲堆(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可以指明是那个文件的那...

c++中new是什么意思
一般来说,使用new申请空间时,是从系统的“堆”(heap)中分配空间。申请所得的空间的位置时根据当时的内存的实际使用情况决定的。但是,在某些特殊情况下,可能需要在程序员指定的特定内存创建对象,这就是所谓的“定位放置new”(placement new)操作。

c#中New关键字有什么作用
它只能代表人【能】做什么,比如说人能说话,人能吃饭。但是却不能让人【去】做什么。因为人类只是抽象出来的,虚设的东西。你要想让人【去】做事,你就得将这种抽象实例化。实例就是指定一个人,通俗的就是创造一个人。创造即为new(新建)。比如TextBox类,你要让他去显示,去被赋值,你就得n...

C++语言中,new表示什么的关键字?
可以自定义一个new_handler,并使用std::set_new_handler函数使其生效在自定义的new_handler中,我们可以抛出异常,可以结束程序,也可以运行一些代码使得有可能有内存被空闲出来,从而下一次分配时也许会成功,也可以通过set_new_handler来安装另一个可能更有效的new_handler例如:...

JAVA中方法前加new是什么意思?
new的作用是实例化。比如有一种类叫狗类,你要创造一只阿黄,你就得这么创造:狗类 阿黄=new 狗类();这句话的意思是声明,阿黄是属于狗类这种类的,同时他的名字叫阿黄。在JAVA语言中,new是实例化,你也可以理解为创造,从一种类中创造出一个真实的个体。

从字节码层面去看new一个对象的执行过程
至于为什么要 dup 一遍?我们首先要知道 invokespecial 指令是会消耗掉刚刚new出来的对象的在操作数栈中的引用的。如果直接消耗掉了,那么我们后续怎么拿到这个对象的引用?很显然拿不到对吧,因此就得 dup 一遍,这样就算栈中消耗了一份,也还会剩下来一份,后续才可以拿到该对象引用。接着就是 astore_...

java对象,直接new,用静态变量返回static块中new好的对象,用synchronized...
这样跟new出来的初始化时不一样的。第二和第三种情况在多线程环境下除了一个直接得对象,一个加锁得对象,当然实例的时间也有区别的,除了这些还有什么其他区别?”jvm处理时的时间和空间比较,空间上来看,每次调用都new,频繁调用后必然会触发GC,而调用GC进行回收时一般都会暂停工作线程,如果回收时间...

javascript中 new Object();是得到了什么呢?
1.var obj = new Object();\/\/就是创建了一个空对象的实例 在Java中,你可能要先构造一个类,然后才能创建类的实例对象,但在JS里,Object就是系统全局对象,所以可以直接创建一个实例对象,而无须提前构造 Object.class 2.obj.color = "red";\/\/就是给实例对象创建一个属性,你可以随便像这样创建任何...

A a=new A(); 求详细说明java中各个A、a及new的含义?
A是类名 a是变量名 new是创建一个对象,在这里创建一个类型为A的对象 A()是A的构造函数 这句话就是:声明类型为A的变量a,new(创建)一个类型为A的对象并赋值给a

我在VS2013中new了一个Form2,但是如何才能点开在Form2的设计图,使得我...
右键你的项目 -->添加-->新建项 2.弹出的窗口选Window窗口,确定 3.你项目中就有Form2出来了,双击你的Form2,Form2设计窗口会出现在左侧窗口了 4.你就可以从工具箱中拖控件了

屏边苗族自治县18957432442: C++中new出得对象与C中的malloc出得有什么联系和区别? -
端木矿肾炎: new是c++的运算符 malloc是c的函数.所以从效率上来说 new的效率更高.另外, 在对象操作上,new会调用构造函数,而malloc只是单纯分配内存.所以 在c++对象申请中,必须用new而不是malloc

屏边苗族自治县18957432442: C语言中的malloc和C++中new的区别 -
端木矿肾炎: new是5261C++的运算符 malloc是C的函数. 所以从效率4102上来说 new的效率更高. 另外,1653 在对象操作上,new会调用构造函数,而malloc只是单纯分配内存.内 所以 在C++对象申容请中,必须用new而不是malloc

屏边苗族自治县18957432442: c中malloc与new的区别 -
端木矿肾炎: 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指针.

屏边苗族自治县18957432442: C++用new来创建对象和非new来创建对象的区别 -
端木矿肾炎: C++用new来创建对象和非new来创建对象的区别 我们都知道C++中有三种创建对象的方法,如下: #include using namespace std; class A { private: int n; public: A(int m):n(m) { } ~A(){} }; int main() { A a(1); //栈中分配 A b = A(1); //栈中分配 A* c = ...

屏边苗族自治县18957432442: C++new出来的和直接声明的对象变量有什么不同 -
端木矿肾炎: 1存储方式不同,new在堆栈里面,直接声明的是局部变量了.2new的用完要delete,直接声明函数执行完自动释放了.

屏边苗族自治县18957432442: 关于c++中new的用法 -
端木矿肾炎: new出一个对象指针当然不会执行构造函数,同样delete掉该对象指针也不会执行析构函数.举例:#include "iostream.h" class A { public: A() { cout<<"执行构造函数"<<endl; } ~A() { cout<<"执行析构函数"<<endl; } }; int main() { cout<<"构...

屏边苗族自治县18957432442: C++中NEW是什么意思呢.急需 -
端木矿肾炎: c++ 中NEW是一个操作符,也就意味着NEW是个关键字,而操作符也就意味着是内置在编译器内部的. NEW用来生成某种类型的一个对象,就是楼上说的实例化一个对象,通常这个对象是在堆中生成,相应NEW的是DELETE用来销毁一个已生成的对象以释放堆空间.NEW和DELETE在C++中编译器会自己管理的,而不象C中的MALLOC和FREE要自己进行一些管理工作,如:检查分配成功与否.

屏边苗族自治县18957432442: C++中new用法 -
端木矿肾炎: new表达式在自由存储区中分配创建一个对象并返回此对象的地址 其对象可以是内置类型或者类类型 如为类类型动态分配空间 string *ps=new string 就是创建一个空的string对象并将地址赋给指向string对象的指针ps!

屏边苗族自治县18957432442: C++中new和mallow 什么区别? 稍微详细点,谢谢 -
端木矿肾炎: malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符.它们都可用于申请动态内存和释放内存. 对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求.对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数.由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free. 因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete.注意new/delete不是库函数.

屏边苗族自治县18957432442: C++中对象new与new 有什么区别? -
端木矿肾炎: @为梦奔跑:new对象的寻址更灵活点而已,在一般开发里,常规定义与指针定义的区别不是很大.一般都是建议能不使用指针对象的时候不要使用.另外,非new生成的对象也可以通过取地址的方式把对象赋值给一个指针变量,此时,则千万别对指针进行析构(delete),事实上也析构不了(会有运行错误,因为对象本身是非new构造的).new操作使用最多的地方是强制分配内存块.具体的情况还是要根据实际情况来考虑.我不用C/C++已经多年了,很多也都丢光了.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网