zoukankan      html  css  js  c++  java
  • new delete和malloc free的区别

    部分内容摘自:http://www.52rd.com/bbs/Archive_Thread.asp?SID=209143&TID=3&WebShieldDRSessionVerify=QWlrR3KW8IElo27YO6zv

    一、他们分别是什么

    new和delete是c++中的操作符,malloc和free是c/c++的标准库函数。

    在使用完分配的内存时,要及时用delete和free进行内存释放,避免内存泄漏。

    二、他们之间的区别

    1、malloc的原型为:void * malloc(size_t size),size就是分配的空间大小以字节为单位,例如想分配10个int型数据的大小空间

    int *p = (int *)malloc(sizeof(int)*10),原型返回的是void *类型,所以在进行分配的时候要对其类型进行强制转换。

    2、free的原型为:  void  free(void *ptr),ptr就是指针指向的分配到堆的内存空间,例如想要把上面的int给释放掉就可以直接free(ptr)即可。

    3、new和delete就是c++中的操作符,可以随时对其进行重载操作,有了malloc和free,那为什么c++还要引进new和delete呢,原因很简单,因为malloc只是分配一块空间,而不会去管你是什么类型的数据,这样的话就无法对c++中的对象进行分配空间,而new是直接分配对象数组大小的空间。

    4、new分配的,再用delete进行回收的时候,理论上不会报错,但是并不建议这样去做。

    三、new、delete的重载

    #include <iostream>
    #include <stdlib.h>
    
    class book
    {
    private:
        static int count;
    public:
        book()
        {
            std::cout << "book 被创建" << std::endl;
        }
        ~book()
        {
            std::cout << "book 被析构" << std::endl;
        }
        static void * operator new(size_t size)
        {
            std::cout << "局部new" << std::endl;
            book *p = ::new book;
            return p;
        }
        static void * operator new[](size_t size)
        {
            std::cout << "数组局部new[]" << std::endl;
            return operator new(size);
        }
        static void operator delete(void *p)
        {
            std::cout << "局部delete" << std::endl;
            ::delete(p);
        }
        static void operator delete[](void *p)
        {
            std::cout << "数组局部delete[]" << std::endl;
            operator delete(p);
        }
    };
    
    
    void * operator new(size_t size)
    {
        void *p = malloc(size);
        std::cout << "全局new" << std::endl;
        return p;
    }
    void * operator new[](size_t size)
    {
        std::cout << "数组全局全局[]" << std::endl;
        return operator new(size);
    }
    void operator delete(void *p)
    {
        std::cout << "全局delete" << std::endl;
        free(p);
    }
    void operator delete[](void *p)
    {
        std::cout << "数组全局delete[]" << std::endl;
        return operator delete(p);
    }
    
    
    void main()
    {
        book *book1 = new book[3];
        delete[] book1;
        system("pause");
    }

    以上是我写的一个关于new和delete重载的例子,从这个例子中也可以直观的看出来对象在生成和销毁时的过程是如何的,运行截图如下

    可以看出来book对象在创建的时候分别调用局部的new[],局部的new,全局的new然后调用构造函数。

    在销毁时调用析构函数,局部delete[],局部delete,全局delete。

    以上就是我对内存分配和销毁的一点认识。

  • 相关阅读:
    juniper ALARM亮红灯
    笔记本设置wifi热点
    基于apache+php+mysql 编译安装详解(转载)
    CentOS6.X 安装MySQL 5.X
    spring 多数据源切换
    Java Reflection(十二):动态类加载与重载
    Java Reflection(十一):动态代理
    Java Reflection(十):数组
    Java Reflection(九):泛型
    Java Reflection(八):注解
  • 原文地址:https://www.cnblogs.com/skblog/p/5425778.html
Copyright © 2011-2022 走看看