有什么区别 new 和 malloc() ?

简介: 有什么区别 new 和 malloc() ?

malloc() 是一个以数字(字节)作为参数的函数; 它返回一个 void* 指向单元化存储。 new 是一个运算符,它接受一个类型和(可选)该类型的一组初始值设定项 作为它的论点; 它返回一个指向其类型的(可选)初始化对象的指针。 当您要分配用户定义类型的对象时,差异最为明显 具有独特的初始化语义。 例子:  

class Circle : public Shape {

   public:

       Circle(Point c, int r);

       // 没有默认构造函数

       // ...

   };


   class X {

   public:

       X();    // 有默认构造函数

       // ...

   };


   void f(int n)

   {

       void* p1 = malloc(40);    // 分配 40 个(未初始化的)字节


       int* p2 = newint[10];    // 分配10个未初始化的整数

       int* p3 = newint(10);    // 分配1个初始化为10的int

       int* p4 = newint();    // 氛围1个初始化为0的int

       int* p4 = newint;    // 分配1个未初始化的int

       Circle* pc1 = new Circle(Point(0,0),10); // 分配一个构造的Circle

                                // 带有指定的参数

       Circle* pc2 = new Circle;    // 错误,没有默认构造函数

       X* px1 = new X;        // 分配一个默认构造的X

       X* px2 = new X();    // 分配一个默认构造的X

       X* px2 = new X[10];    // 分配10个默认构造的X

       // ...

   }

请注意,当您使用“(值)”表示法指定初始化程序时, 您将使用该值进行初始化。 不幸的是,您不能为数组指定它。 通常, vector 是自由存储分配数组的更好替代方案 (例如,考虑异常安全)。

每当您使用 malloc() 时,您都必须考虑初始化并将返回指针转换为正确的类型。 您还必须考虑是否获得了适合您使用的字节数。 当您考虑初始化时,malloc() 和 new 之间没有性能差异。

malloc() 通过返回 0 报告内存耗尽。 new 通过抛出异常来报告分配和初始化错误。

创建的对象 new delete 销毁。 分配的内存区域 malloc() 释放 由free()

 

发现好的文章:细说new与malloc的10点区别 - melonstreet - 博客园 (cnblogs.com)  

相关文章
|
3月前
|
C语言
C语言malloc与free实现原理
malloc()的实现很简单。它首先会扫描之前由 free()所释放的空闲内存块列表,以求找到尺寸大于或等于要求的一块空闲内存。(取决于具体实现,采用的扫描策略会有所不同。例如,first-fit 或 best-fito。)如果这一内存块的尺寸正好与要求相当,就把它直接返回给调用者。如果是一块较大的内存,那么将对其进行分割,在将一块大小相当的内存返回给调用者的同时,把较小的那块空闲内存块保留在空闲列表中。 如果在空闲内存列表中根本找不到足够大的空闲内存块,那么 malloc()会调用 sbrk()以分配更多
17 0
C语言malloc与free实现原理
|
5月前
|
存储 Cloud Native Linux
malloc、free 和 new、delete 的区别
malloc、free 和 new、delete 的区别
|
6月前
|
编译器 程序员 测试技术
详解动态内存管理【malloc/calloc/realloc/free函数/柔性数组】【C语言/进阶/数据结构基础】
详解动态内存管理【malloc/calloc/realloc/free函数/柔性数组】【C语言/进阶/数据结构基础】
173 0
|
4月前
|
程序员 编译器 C语言
C语言动态内存管理函数(malloc、free、calloc、realloc)
开辟内存空间的⽅式有两个缺点: • 空间开辟⼤⼩固定 • 数组声明时,必须指定数组的⻓度,长度⼀旦确定了便不能调整 而实际情况是,很多时候我们所需要的空间⼤⼩只有在程序运⾏后才能知道,为此C语⾔引⼊了动态内存开辟这个概念,让程序员⾃⼰可以申请和释放内存空间,这样就显得比较灵活了。
|
6月前
|
编译器 程序员 C语言
【C语言】动态内存管理(malloc,free,calloc,realloc,柔性数组)
【C语言】动态内存管理(malloc,free,calloc,realloc,柔性数组)
|
1月前
|
存储 程序员 Shell
【C/C++ 内存管理函数】C语言动态内存管理大揭秘:malloc、calloc、realloc与new的对比与差异
【C/C++ 内存管理函数】C语言动态内存管理大揭秘:malloc、calloc、realloc与new的对比与差异
175 0
|
3月前
|
C语言
C语言——动态内存管理(malloc, calloc, realloc, free, 柔性数组详解)
C语言——动态内存管理(malloc, calloc, realloc, free, 柔性数组详解)
|
3月前
|
C语言 程序员
【C语言基础教程】内存的申请和释放(malloc、free、realloc、calloc)
【C语言基础教程】内存的申请和释放(malloc、free、realloc、calloc)
401 0
【C语言基础教程】内存的申请和释放(malloc、free、realloc、calloc)
|
4月前
|
监控 Java Unix
日常知识点之内存泄露定位手段(c语言hook malloc相关方式)
日常知识点之内存泄露定位手段(c语言hook malloc相关方式)
40 0
|
9月前
|
编译器 C语言
【C语言】动态内存分配malloc,realloc等函数使用和常见错误(上)
【C语言】动态内存分配malloc,realloc等函数使用和常见错误(上)
56 0