C/C++——new/delete和malloc/free的区别

new/deletemalloc/free的区别


  •  扩容操作:

对于malloc是有一个realloc函数对应用于扩容的;

对于new,只能再new一个,for循环赋值过去,把原来的delete掉;

  • 对于 对象:

malloc只进行空间的申请,不调用构造函数初始化对象。free也不会调用析构函数。

这段代码什么也不会输出。

#include <iostream>
using namespace std;

class A {
public:
    int x;
    A() {
        x = 1;
        cout << "constructor." << endl;
    }
    ~A() {
        cout << "destructor." << endl;
    }
};
int main() {
    A *a = (A *)malloc(sizeof(A));
    free(a);
    return 0;
}

 使用new操作符的三个步骤:

  1. 调用operator new() 函数 分配用于存储 相应对象  指定大小的 内存空间。
  2. 调用 构造函数
  3. 返回指向该对象的指针(malloc返回的是void *指针)。

使用delete操作符的两个步骤:

  1. 调用 析构函数
  2. 调用operator delete() 函数释放内存空间。

    PS:上次用C++写单链表,还因为 1 出了错,X_X。

        ~LNode() {
            LNode *p = this->next;
            while (p) {
                LNode *t = p->next;
                delete p;
                p = t; } } 
  • new/delete可以进行重载

 C++对new/delete函数进行了很多类型的重载,通常(我不太确定是不是所有的都是X_X)底层是用malloc/free来实现的。


其他还有一些我们已经当成习惯的区别:

  • 在处理数组时,free(array); delete[] array;
  • 内存分配失败,new会抛出异常,malloc会返回NULL,所以一般用malloc后面都会加 if ( ..... == NULL )
  • 一个是C语言的库函数,需要#include<malloc.h>;一个是关键字。
  • 对于C语言程序(*.c文件),只能使用malloc/free。
  • 使用new操作符申请内存分配时无须指定内存块的大小,编译器会根据类型信息自行计算。而malloc则需要显式地指出所需内存的尺寸。

猜你喜欢

转载自www.cnblogs.com/czc1999/p/10323154.html