8.new-delete操作与malloc-free的操作异同

发布时间 2023-07-03 21:21:02作者: CodeMagicianT

相同点

●都可用于内存的动态申请和释放

●new和malloc都可以分配指定大小的内存块,并且分配的内存都在堆上。

●new和malloc的结果都返回一个指向已分配内存的指针。

●都允许使用字面量作为参数来分配内存。

不同点

●前者是C++运算符,后者是C/C++语言标准库函数

●new自动计算要分配的空间大小,malloc需要手工计算

●类型检查不同:new 会进行类型检查,确保在分配内存时,所分配的内存是正确的类型。如果类型不匹配,new 会抛出一个 std::bad_alloc 异常。而 malloc 不提供类型检查,可能会导致运行时错误。

●构造函数:new 会在分配内存后调用对象的构造函数(如果有定义)。这意味着在使用 new 分配的对象时,其成员变量已经被正确初始化。而 malloc 在分配内存后不会调用构造函数,因此需要手动为对象的成员变量赋初值。

●内存管理:newdelete 负责管理动态分配的内存。当使用 new 分配内存时,需要使用 deletedelete对指针所指对象运行适当的析构函数释放已分配的内存;同样,当使用 malloc 分配内存时,需要使用 free 释放已分配的内存。这有助于避免内存泄漏和悬空指针问题。

●new是封装了malloc,直接free不会报错,但是这只是释放内存,而不会析构对象

●异常处理:new 会抛出异常(如上述所述)以指示内存分配失败。而 malloc 可能返回一个空指针(即 NULL),或者返回一个无效的内存地址,这可能导致其他类型的错误。

总之,new 更安全、更易于维护,并提供了类型检查和自动内存管理功能。然而,它也具有一定的开销,因为它需要调用构造函数并负责释放内存。在许多情况下,使用 malloc 可能更适合,特别是在性能要求较高的场景中。