如何覆盖已在命名空间中定义的operator new

时间:2014-01-21 09:29:59

标签: c++ memory-management operator-overloading

我目前正在开发基于Playground游戏引擎的游戏,我偶然发现了一个问题。我正在尝试为我的游戏对象实现某种内存池,但是当我尝试使用placement new运算符或在游戏类中定义我自己的新运算符时,游戏将无法编译,因为这部分代码是在其中一个游戏库文件中:

// Operator NEW can't be in the PF namespaces...

// Memory tracking allocation
inline void* __cdecl operator new(size_t nSize, const char * lpszFileName, int nLine)
{
    return TRACK_MEMORY( pf_malloc_dbg(nSize, lpszFileName, nLine) );
}
inline void* __cdecl operator new(size_t nSize)
{
    return TRACK_MEMORY( pf_malloc_dbg(nSize, "FileWithoutDEBUG_NEW", 0) );
}
inline void* __cdecl operator new[](size_t nSize, const char * lpszFileName, int nLine)
{
    return TRACK_MEMORY( pf_malloc_dbg(nSize, lpszFileName, nLine) );
}
inline void __cdecl operator delete(void* p, const char * lpszFileName, int nLine)
{
    (void)nLine ;
    (void)lpszFileName;
    pf_free_dbg(p);
}
inline void __cdecl operator delete[](void* p, const char * lpszFileName, int nLine)
{
    (void)nLine ;
    (void)lpszFileName;
    pf_free_dbg(p);
}
inline void __cdecl operator delete(void* p)
{
    pf_free_dbg(p);
}
inline void __cdecl operator delete[](void* p)
{
    pf_free_dbg(p);
}

这段代码位于debug.h游戏库文件中,它包含在库文件中某处的游戏命名空间中,所以我不能在编译时省略它。代码仅在调试模式下使用,而不是在发布中使用,但我想使两种模式都能正常工作,以便更容易地跟踪错误。所以,当我在我的一个课程中尝试这样的事情时:

static MemPool<sizeof(Foo)> Foo::memPool;

Foo *Foo::Create()
{
    Foo *ptr = new (memPool.Alloc()) Foo();
    return ptr;
}

我收到此错误:error C2061: syntax error : identifier 'memPool'。这不是因为memPool未声明或定义,而是因为debug.h中new运算符的定义。或者当我尝试这样的事情时:

class Foo
{
    ...

    inline void* operator new(size_t nSize)
    {
        return malloc(sizeof(Foo));
    }

    ...
};

我收到错误:error C2660: 'GameNamespace::Foo::operator new' : function does not take 3 arguments

我该如何解决这个问题?

0 个答案:

没有答案