我目前正在开发基于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
我该如何解决这个问题?