如何重载模板类的“新”运算符?
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>();
因为你不应该那样做。
【讨论】:
以上是关于如何重载模板类的“新”运算符?的主要内容,如果未能解决你的问题,请参考以下文章