new delete和malloc free的区别

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

1、他们分别是什么c++

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

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

2、他们之间的区别spa

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

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

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

三、new和delete就是c++中的操做符,能够随时对其进行重载操做,有了malloc和free,那为何c++还要引进new和delete呢,缘由很简单,由于malloc只是分配一块空间,而不会去管你是什么类型的数据,这样的话就没法对c++中的对象进行分配空间,而new是直接分配对象数组大小的空间。blog

四、new分配的,再用delete进行回收的时候,理论上不会报错,可是并不建议这样去作。内存

3、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。

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

相关文章
相关标签/搜索