new和delete操作符重載

  1. #include <iostream>
  2. #include <new>
  3. using namespace std;
  4. class MemoryPool
  5. {
  6. };
  7. class MemoryObject
  8. {
  9. private:
  10.     MemoryPool* aPool;
  11. public:
  12.     MemoryObject(MemoryPool* p)
  13.     {
  14.         aPool = p;
  15.     };  
  16.     voidoperator new(size_t);
  17.     static voidoperator new(size_t, int i);
  18. };
  19. void* MemoryObject::operator new(size_t)
  20. {
  21.     return NULL;
  22. }
  23. void* MemoryObject::operator new(size_t,int i)
  24. {
  25.     return NULL;
  26. }
  27. void main()
  28. {
  29.     MemoryPool aPool;
  30.     void* p = new MemoryObject(&aPool);
  31.     if (p==NULL)
  32.     {
  33.         cout<<"NULL p"<<endl;
  34.     }
  35.     void* p2 = new(3) MemoryObject(&aPool);
  36.     if (p2==NULL)
  37.     {
  38.         cout<<"NULL p2"<<endl;
  39.     }
  40. };

在編寫內存池代碼的時候,遇到這個問題,遂解決之。

參考:http://kuapig.ycool.com/post.2726735.html

下面是一個稍微複雜一點的例子:注意,重載了new以後,沒有執行構造函數。

  1. #include <iostream>
  2. #include <new>
  3. using namespace std;
  4. class MemoryPool;
  5. class MemoryObject
  6. {
  7. public:
  8.     const MemoryPool* aMemPool;
  9. public:
  10.     MemoryObject(const MemoryPool* obj):aMemPool(obj)
  11.     {
  12.     }
  13.     static voidoperator new(size_t,int a,int b)
  14.     {
  15.         return NULL;
  16.     }
  17. };
  18. class MemoryPool
  19. {
  20. public:
  21.     int i;
  22.     MemoryPool():i(98){};
  23. };
  24. void main()
  25. {
  26.     MemoryPool aMemPool;
  27.     MemoryObject aMemObj(&aMemPool);
  28.     cout<<(aMemObj.aMemPool)->i<<endl;
  29.     void * p = new(3,5) MemoryObject(&aMemPool);
  30.     if (p==NULL)
  31.     {
  32.         cout<<"asdsadsa"<<endl;
  33.     }
  34. }

明白了new重載的道理,我們在new MemoryObject對象的時候,就知道如何將底層的實現送給MemoryPool的Alloc函數處理了,最後的返回值,實際上是MemoryPool處理後返回的。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章