因为我们的应用程序有硬性能和内存限制,所以我们的编码标准禁止使用默认堆——即 no malloc
,no default new
。每个内存分配都必须选择几个特定分配器之一;就像是
// declared globally
void* operator new( size_t size, CustomAllocHeap* heap, const char* perpetrator_name )
{
return heap->Allocate( size, perpetrator_name );
}
// imagine a bunch of CustomAllocHeap's declared globally or statically, thus
Vector* v = new( gPhysicsHeap, __FUNCTION__ ) Vector( 1.0f, 2.0f, 3.0f, 4.0f );
// or in a class
Thingy* p = new( this->LocalArenaHeap, __FUNCTION__ ) Thingy();
尽管我们的代码在这方面保持了良好的纪律,但一些标准 C++ 组件(容器std::function
)会暗中调用默认new
堆,这是非常糟糕的。
以某种方式完全禁用默认值会很好new
,这样任何隐式导致默认分配的代码行都会立即引发编译器错误。这会让我们马上注意到这些事情。
我们显然可以new
抛出运行时错误,即
void* operator new ( size_t ) { __debugbreak(); return NULL; }
但最好在编译时收到有关此的警告。那可能吗?
我们的应用是为固定平台构建的(x64 和 Visual Studio);便携性无关紧要。