由于我们的应用程序有严格的性能和内存限制,我们的编码标准禁止使用默认堆—,即没有malloc
,没有默认new
。每个内存分配必须选择几个特定的分配器之一;像是否可以完全禁用默认的C++ 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; }
,但它会更好,在编译时获得有关此警告。那可能吗?
我们的应用程序是为固定平台(带有Visual Studio的x64)构建的;便携性无关紧要。
您是否尝试过寻找连接器输出?我认为你可以从链接器映射输出中知道allocator例程是否被调用。它并没有指出违规的路线,但至少它可以在建造时破门而入。 –
这里有一个有趣的指针:http://bytes.com/topic/c/answers/854450-there-any-way-disable-global-operator-new – SirDarius
是否可以实现默认(所有形式)的新/删除您的自定义新的?我似乎记得可以使用.def文件导出新/删除,导致使用导出版本的(整个?)过程。 – stijn