首页 > 其他 > 详细

new/delete和malloc/free

时间:2015-12-02 00:40:11      阅读:222      评论:0      收藏:0      [点我收藏+]

首先我们来谈谈malloc与free
    malloc和free是C函数库提供的两个函数,malloc从堆上(也叫自由存储区)分配一块合适的内存,冰箱改程序返回一个指向这块内存的地址。free函数把它归还给内存池供以后使用。
        注意的是这块内存并没有以任何形式进行初始化,如果进行初始化:要么自己动手进行初始化,要么使用calloc函数。
    两个函数原型:
        void *malloc(size_t size);
        void free(void *pointer);
        malloc的参数就是需要分配的内存字节数(注意malloc不能自动计算字节大小,必须直接传字节数),如果内存池的内存满足这个需求,malloc就会返回一个指向被分配的内存块起始位置的指针;如果内存池为空或者不能满足你的分配需求,malloc将返回一个NULL指针(这点很重要,告述我们每个从malloc返回的指针用的时候都要检查是否为NULL)。
        free函数的参数要么是NULL(不会产生任何效果),要么就是就是先前从malloc返回的值。只有这两种。释放一块内存的一部分是不允许的,动态分配的内存必须整块一起释放,但是有realloc的特性(缩小一块动态分配的内存),可以有效的释放他尾部的部分内存
    注意观察的人会发现malloc返回的是一个 void*,那我们在内存上存储整数,浮点数和其他类型的时候该怎么办?
        由于malloc返回的void*的指针,所以就表示该类型的指针可以转换为其他任何类型的指针,一般我们也经常会进行强制转换。
        pi=(int *)malloc(100);//这就是讲malloc返回的指针强制转换为int型的指针。
        pi=(int *)malloc(25*sizeof(int));//这是和上面的效果一样的语句,但是我们经常用这个,因为可移植性好。
下面我们谈谈new和delete
    C++中的解决方案是把创建一个对象所需的所以动作都结合在一个成为new的运算符里。
        new创建一个对象时,他就在队里为对象分配内存并为这块内存调用构造函数。
            Mytype *fp=new MyType(1,2);
        上面这个例子等价于调用了malloc(sizeof(MyType)),并使用(1,2)参数列表来为MyType调用构造函数,this指针指向返回值的地址。
        默认的new还进行检查一确信在传递地址给构造函数之前内存分配是成功的,所以不用显示的确认是否成功。
        delete表达式首先调用析构函数,然后在释放内存。(通常是free())
        delete需要一个对象的地址。
            delete fp;
区别和联系:
    1,new与delete和malloc与free都可以动态的分配内存和释放内存;
    2,new和delete是c++操作符;malloc和free是C/C++库函数;        
    3,new返回时指定类型的指针,并且可以自动计算所需的内存大小;malloc必须有我们自己计算所需的分配的内存大小,并且返回后强制转换为实际类型的指针;        
    4,由于malloc与free是C++/C 语言的标准库函数,new/delete 是C++的运算符。对于非内部数据类的对象而言,只用maloc/free函数是不能够满足动态对象的要求。对象在创建的同时要自动执行构造函数, 对象消亡之前要自动执行析构函数。由于malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加malloc/free。而new和delete是操作符在创建对对象的时候调用构造函数,在释放对象之前调用析构函数。
    
new与delete成对使用,malloc和free成对使用,混合在一起并不好,例如:用malloc创建动态对象是用delete来释放,因为new和delete实现机制都是有了malloc()和free(),所以很可能在没有析构的时候就释放了内存。所以我们一定要配对的使用。
由于malloc和free对于构造函数和析构函数一无所知,并且将malloc/free与new/delete混合使用会带来很多麻烦,所以在C++中尽量使用new和delete这对组合。

new/delete和malloc/free

原文:http://www.cnblogs.com/jlxuexijidi-2015/p/5011592.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!