2010-06-21 42 views
3

表達式operator new(sizeof(T))通過::operator new分配T字節,正確嗎?致電班級專用運營商新

有什麼方法調用operator new特定於類的版本,如果它存在,如何new T()分配內存(調用構造函數之前)完全相同的方式?

T::operator new(sizeof(T))給出如果T編譯時錯誤沒有定義operator new,從基類定義它即使T繼承。我想呼籲的是:

  • Foo::operator new如果Foo定義operator new
  • Base::operator new如果從BaseFoo導出定義operator new(我該怎麼辦有關多重繼承?)
  • ::operator new否則
+0

爲什麼你需要明確地調用它?如果運算符'new'對於一個類來說是重載的,那麼編譯器會在你用'new ClassName'實例化那個對象時使用它。 – 2010-06-21 11:06:44

+0

@Ama:因爲我不想實例化對象。我只想要記憶,所以我可以在以後的時間點使用新的位置。 – fredoverflow 2010-06-21 11:08:29

+0

你能解釋你想達到的目標嗎?當然,如果你將內存的分配與對象的構建分開,你可以以任何你認爲合適的方式分配內存。你爲什麼需要像'new T'一樣分配內存? – 2010-06-21 16:21:39

回答

1

標準庫解決了使用分配器對象,其類型被設置爲一個需要定製的分配算法的類的一個模板參數這個問題。

我不認爲有任何完整的方法可以做你所問的事情,正如第二項子彈已經證明的那樣。如果編譯器定義了一個,那麼編譯器無法知道哪個父級的操作符是新的。

如果你想要實現一個小的對象分配器池,在編譯時選擇合適的大小/池,那麼使用獨立的模板分配器函數怎麼樣:這將被稱爲類似於object_allocator<T>::allocate(),模板類型會讓你自動計算出尺寸。由於存在多重繼承問題,您仍然無法繼承運算符new,但可以輕鬆找出如何在任何類中分配內存。

0

定義不同的靜態函數allocate並從調用此函數

class X { 
public: 
    static void * allocate(size_t size) { 
      //... 
    } 
    void *operator new(size_t size) { 
     return allocate(size); 
    } 
}; 

void f() { 
    void * p = X::allocate(sizeof(X)); 
    X * x = new(p) X; 
} 
+0

該解決方案對我的口味太過侵入:( – fredoverflow 2010-06-21 11:14:13