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。

以上就是我對內存分配和銷燬的一點認識。

相關文章
相關標籤/搜索