2013-03-29 51 views
1

我正在嘗試使用模板化對象池,我無法重載位置new運算符。新運算符使用默認構造函數,但不使用非默認構造函數。在這裏我正在粘貼我的簡單代碼。 http://www.cplusplus.com/reference/new/operator%20new/將構造函數參數轉發到位置new運算符

當你使用它

#include <boost/pool/object_pool.hpp> 
#include <cstddef> 

template<typename T> 
class objectPool 
{ 
    public: 
     void* operator new (std::size_t num) { void *vp = _pool.malloc(); T *t = ::new(vp)T; return t; } 
     void* operator new[] (std::size_t num) { void *vp = NULL; assert(0); return vp; } 
     void operator delete (void *vp) { _pool.free(static_cast<T*>(vp)); return; } 
     void operator delete [] (void *vp) { assert(0); return; } 

    private: 
     static boost::object_pool<T> _pool; 
}; 

template<typename T> 
boost::object_pool<T> objectPool<T>::_pool; 

class number : public objectPool<number> 
{ 
    long long _value1, _value2; 
    public: 
    number(long long value1, long long value2) : _value1(value1), _value2(value2) { return; } 
    ~number(){ return; } 
    void print() { std::cerr<<"_value1:"<<_value1<<"_value2:"<<_value2; return; } 
}; 

int 
main(int ac, char **av) 
{ 
    number *n = new number(1000, 2000); 
    n->print(); 
    delete n; 
    return 0; 
} 

回答

3

操作new不會調用構造器,它分配內存,構造函數被調用:

//normal new 
new T(a1, a2); 
//placement new 
new (na1, na2) T(a1, a2) 

你應該只在您刪除新的呼叫new運營商和返回vp

相關問題