zoukankan      html  css  js  c++  java
  • 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函数进行了很多类型的重载,通常底层是用malloc/free来实现的。


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

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

     此外还有一些

        node* n1 = (node*)malloc(sizeof(node));//只会分配内存空间
        //对于下面两个,如果没重写了默认构造函数,则它们是没有区别的
        //如果没有自己重写默认构造函数(当然也没有写构造函数),则new node只是分配内存空间,new node()会调用默认构造函数
        node* n2 = new node;
        node* n3 = new node();
  • 相关阅读:
    Eclipse创建Python工程
    MySQL python安装
    pip安装-python2.7.15
    接口测试-HTTP重点知识及 测试工具
    接口测试-基础
    关闭win10的自动更新功能
    高版本MySQL(5.7,5.8)的JDBC连接新问题
    错误:java.sql.SQLException: Access denied for user ''@'localhost' (using password: NO)
    Idea SpringBoot工程提示 "Error running 'xxxx'": Command line is too long... 问题解决
    错误:23:36:21.161 [main] ERROR org.springframework.boot.SpringApplication
  • 原文地址:https://www.cnblogs.com/czc1999/p/10323154.html
Copyright © 2011-2022 走看看