简体   繁体   中英

forwarding constructor arguments to the placement new operator

I am trying to use templatized object pool , i have trouble overloading the placement new operator. the new operator works with default constructor but not with non default ones. here i am pasting my simple code.

#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;
}

Operator new does not call contructor, it allocates memory http://www.cplusplus.com/reference/new/operator%20new/

When you are using it, constructor get called:

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

You should just remove new call in you new operator and return vp

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM