1

テンプレート化されたオブジェクト プールを使用しようとしていますが、配置の新しい演算子をオーバーロードするのに問題があります。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;
}
4

1 に答える 1

3

オペレーターnewはコンストラクターを呼び出さず、メモリを割り当てますhttp://www.cplusplus.com/reference/new/operator%20new/

あなたがそれを使用しているとき、コンストラクターが呼び出されます:

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

オペレーターで新しい呼び出しを削除しnewて戻るだけですvp

于 2013-03-29T13:48:50.763 に答える