如何重载模板类的“新”运算符?

Posted

技术标签:

【中文标题】如何重载模板类的“新”运算符?【英文标题】:How can I overload the "new" operator for template classes? 【发布时间】:2012-08-31 05:30:36 【问题描述】:

我尝试在下面的模板类中重载new 运算符以使用malloc 而不是new,但没有成功。

template< int SIZE >

class MemPoolT : public MemPool


    public:
        MemPoolT() : root(0), currentAllocs(0), nAllocs(0), maxAllocs(0) 

        ~MemPoolT()
        
            for( int i=0; i<blockPtrs.Size(); ++i ) 
                delete blockPtrs[i];
            
        

        virtual void* Alloc() 
        
            if ( !root ) 

                // Need a new block.

                Block* block = new Block();
                blockPtrs.Push( block );

                for( int i=0; i<COUNT-1; ++i ) 
                    block->chunk[i].next = &block->chunk[i+1];
                
                block->chunk[COUNT-1].next = 0;
                root = block->chunk;
            
            void* result = root;
            root = root->next;

            ++currentAllocs;
            if ( currentAllocs > maxAllocs ) maxAllocs = currentAllocs;
            nAllocs++;
            return result;
        
    private:
        enum  COUNT = 1024/SIZE ;
        union Chunk 
            Chunk* next;
            char mem[SIZE];
        ;
        struct Block 
            Chunk chunk[COUNT];
        ;
        Chunk* root;
        int currentAllocs;
        int nAllocs;
        int maxAllocs;
;

我该怎么做?

【问题讨论】:

我没有看到你在任何地方超载new 它是特定于实现的,但 new 通常使用 malloc 进行实际分配。我看不出重载 new 以使用 malloc 的意义。 【参考方案1】:

这是你要求的吗?

#define malloc new

MemPoolT<N> m = malloc MemPoolT<N>();

因为你不应该那样做。

【讨论】:

以上是关于如何重载模板类的“新”运算符?的主要内容,如果未能解决你的问题,请参考以下文章

模板类的重载赋值运算符

如何在具有动态大小数组的模板类中重载 operator=

如何为从C++中的模板继承的类重载赋值运算符

C++学习:5其他语法

模板类和插入提取重载

模板类复制内部类问题中的模板赋值运算符