zoukankan      html  css  js  c++  java
  • 既生malloc/free,何生new/delete?

    在C或者C++中,malloc/free和new/delete都是用来申请内存和释放内存的,这样做是不是有些的冗余?这个问题曾经萦绕了不少时间,现在才搞清楚.

    1. malloc/free是标准库里面定义的函数,而new/delete是C++的运算符.

    2. 对于非内部数据类型的对象而言,对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数. 由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free,因此光用malloc/free无法满足动态对象的要求.

    3. new/delete不是库函数, C++运算符使用运算符new分配和初始化动态内存,用运算符delete完成内存的清理与释放.

    4. 对于内部数据类型的“对象”而言,由于没有构造与析构的过程,因此对它们来说malloc/free和new/delete的效果是一样的.

    这就引出了一个疑问:既然new/delete的功能完全覆盖了malloc/free,为什么C++不把malloc/free淘汰出局呢?

    1. 这是因为C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存.

    2. 用free释放new创建的动态对象,那么该对象因无法执行析构函数而可能导致程序出错.

    3. 如果用delete释放malloc申请的动态内存,结果也会出错。

    因此,不要用malloc/free来操作动态对象的内存,此时应用new/delete. 而对于C++中调用的C程序就需要用malloc/free. new/delete和malloc/free必须分别成对使用.

  • 相关阅读:
    HDU 1010 Tempter of the Bone(DFS剪枝)
    HDU 1013 Digital Roots(九余数定理)
    HDU 2680 Choose the best route(反向建图最短路)
    HDU 1596 find the safest road(最短路)
    HDU 2072 单词数
    HDU 3790 最短路径问题 (dijkstra)
    HDU 1018 Big Number
    HDU 1042 N!
    NYOJ 117 求逆序数 (树状数组)
    20.QT文本文件读写
  • 原文地址:https://www.cnblogs.com/make217/p/5774191.html
Copyright © 2011-2022 走看看