首页 文章

new / delete和malloc / free有什么区别?

提问于
浏览
261

new / deletemalloc / free 有什么区别?

相关(重复?):In what cases do I use malloc vs new?

15 回答

  • 27

    最相关的区别是 new 运算符分配内存然后调用构造函数, delete 调用析构函数然后释放内存 .

  • 0

    new 调用对象的ctor, delete 调用dtor .

    mallocfree 只需分配和释放原始内存 .

  • 1

    在C new / delete 中相应地调用构造函数/析构函数 .

    malloc / free 只需从堆中分配内存 . new / delete 也分配内存 .

  • -3

    new / delete 是C, malloc / free 来自好老C.

    在C中, new 调用对象构造函数, delete 调用析构函数 .

    mallocfree ,来自OO之前的黑暗时代,只分配和释放内存,而不执行任何对象的代码 .

  • 438

    新/删除

    • 分配/释放内存

    • 从'Free Store'分配的内存

    • 返回完全类型的指针 .

    • new(标准版)永远不会返回NULL(将失败时抛出)

    • 使用Type-ID调用(编译器计算大小)

    • 具有显式处理数组的版本 .

    • 重新分配(以获得更多空间)未直观处理(因为复制构造函数) .

    • 是否调用malloc / free是实现定义的 .

    • 可以添加新的内存分配器来处理内存不足(set_new_handler)

    • operator new / delete可以合法覆盖

    • constructor/destructor used to initialize/destroy the object

    malloc /免费

    • 分配/释放内存

    • 从'Heap'分配的内存

    • 返回空格*

    • 失败时返回NULL

    • 必须指定所需的大小(以字节为单位) .

    • 分配数组需要手动计算空间 .

    • 重新分配更大的内存块(无需担心复制构造函数)

    • 他们将 NOT 调用new / delete

    • 无法将用户代码拼接到分配序列中以帮助降低内存 .

    • malloc / free可以合法地覆盖 NOT

    表格比较功能:

    Feature                  | new/delete                     | malloc/free                   
    --------------------------+--------------------------------+-------------------------------
     Memory allocated from    | 'Free Store'                   | 'Heap'                        
     Returns                  | Fully typed pointer            | void*                         
     On failure               | Throws (never returns NULL)    | Returns NULL                  
     Required size            | Calculated by compiler         | Must be specified in bytes    
     Handling arrays          | Has an explicit version        | Requires manual calculations  
     Reallocating             | Not handled intuitively        | Simple (no copy constructor)  
     Call of reverse          | Implementation defined         | No                            
     Low memory cases         | Can add a new memory allocator | Not handled by user code      
     Overridable              | Yes                            | No                            
     Use of (con-)/destructor | Yes                            | No
    

    技术上,new分配的内存来自'Free Store',而malloc分配的内存来自'Heap' . 这两个区域是否相同是一个实现细节,这是malloc和new无法混合的另一个原因 .

  • 5

    唯一相似之处是 malloc / new 都返回一个指针,它指向堆上的某些内存,并且它们都保证一旦返回了这样的内存块,除非先释放/删除它,否则不会再次返回 . 也就是说,他们都是"allocate"记忆 .

    但是, new / delete 还通过构造函数,析构函数和运算符重载执行任意其他工作 . malloc / free 只能分配和释放内存 .

    事实上, new 可以充分定制,它不一定从堆返回内存,甚至根本不分配内存 . 但是默认 new 确实如此 .

  • 5

    有一些事情 new 没有这样做 malloc 没有:

    • new 通过调用该对象的构造函数来构造对象

    • new 不需要对已分配的内存进行类型转换 .

    • 它不需要分配大量内存,而是需要构造许多对象 .

    所以,如果你使用 malloc ,那么你需要明确地做上面的事情,这并不总是实际的 . 此外, new 可以重载但 malloc 不能 .

    总之,如果您使用C,请尝试尽可能多地使用 new .

  • 2

    new和malloc之间的主要区别在于new调用对象的构造函数,而相应的delete调用调用对象的析构函数 .

    还有其他差异:

    • new 是类型安全的, malloc 返回 void* 类型的对象

    • new 在出错时抛出异常, malloc 返回 NULL 并设置错误

    • new 是一个运算符,可以重载, malloc 是一个函数,不能重载

    分配数组的

    • new[]malloc 更直观,更安全 .

    • malloc -来源的分配可以通过 realloc 调整大小, new -派生的分配无法调整大小

    • malloc 可以分配一个N字节的内存块,必须要求 new 分配一个数组,比方说 char 类型

    看看差异,总结是malloc是C-esque,new是C -esque . 使用适合您的代码库的那个 .

    尽管使用不同的内存分配算法实现new和malloc是合法的,但在大多数系统中,new使用malloc在内部实现,不会产生系统级差异 .

  • 4

    也,

    全局new和delete可以被覆盖,malloc / free不能 .

    更多新的和删除可以按类型覆盖 .

  • 2

    newdelete 是C基元,它声明一个类的新实例或删除它(从而调用实例的类的析构函数) .

    mallocfree 是C函数,它们分配和释放内存块(大小) .

    两者都使用堆来进行分配 . mallocfree 仍然更多"low level"因为它们只保留了一块可能与指针相关联的内存空间 . 在该内存周围没有创建任何结构(除非您将C数组视为结构) .

  • 77

    new和delete是c中的运算符;也可以超载 . malloc和free是c中的函数;

    malloc在失败时返回null ptr而new抛出异常 .

    malloc返回的地址需要再次输入类型,因为它返回(void *)malloc(size)New返回类型指针 .

  • 13
    • new是一个运算符,而malloc()是一个函数 .

    • new返回确切的数据类型,而malloc()返回void *(void类型的指针) .

    • malloc(),内存未初始化,默认值为垃圾,而在新的情况下,内存使用默认值初始化,就像在_上使用'zero (0)'一样 .

    • delete和free()都可以用于'NULL'指针 .

  • 12
    • 要使用 malloc() ,我们需要在程序中包含 <stdlib.h><alloc.h> ,而 new 不需要 .

    • newdelete 可以重载但 malloc 不能 .

    • 使用展示位置 new ,我们可以传递我们想要分配内存的地址,但是在 malloc 的情况下这是不可能的 .

  • 9

    此代码用于删除关键字或自由功能 . 但是当使用'malloc'或'new'创建一个指针对象并使用delete释放对象内存时,即使该对象指针可以在类中调用函数 . 之后使用free而不是delete然后它也可以在free语句之后工作,但是当使用两者时,只有指针对象不能在类中调用函数..代码如下:

    #include<iostream>
    
    
    using namespace std;
    
    class ABC{
    public: ABC(){
        cout<<"Hello"<<endl;
      }
    
      void disp(){
        cout<<"Hi\n";
      }
    
    };
    
    int main(){
    
    ABC* b=(ABC*)malloc(sizeof(ABC));
    int* q = new int[20];
    ABC *a=new ABC();
    b->disp();
    
    cout<<b<<endl;
    free(b);
    delete b;
    //a=NULL;
    b->disp();
    ABC();
    cout<<b;
    return 0;
    }
    

    输出:你好
    你好
    0x2abfef37cc20

  • 3

    1.new syntex比malloc()简单

    2.new/delete是malloc()/ free()是函数的运算符 .

    3.new/delete执行速度比malloc()/ free()快,因为编译器直接粘贴了新的汇编代码 .

    4.我们可以在运算符重叠的帮助下更改程序中的新/删除含义 .

相关问题