您可以使用malloc
/free
进行基本分配。处理完整的标准合规性new
有点棘手;你需要类似的东西:
void*
operator new( size_t n )
{
void* results = malloc( n );
while ( results == NULL ) {
if ( std::get_new_handler() == NULL ) {
throw std::bad_alloc();
}
(*std::get_new_handler())();
results = malloc( n );
}
return results;
}
但是,您通常不需要如此完全的合规性。如果你说你不支持设置new_handler
,例如,你可以大大简化。在我用于测试的重载版本中,事实上,如果真的失败了,我会中止(但这个版本有选项可以按需malloc
触发失败,因为我想测试我的代码是否也能正确地对其做出反应)。new
如果您正在记录,请非常小心避免无休止的递归。唯一保证不在operator new
标准库中使用的函数是malloc
和free
。当然,很多没有理由动态分配,我也不担心memcpy
or
之类的函数strlen
。在实践中,您可能对 C 库中的任何函数都是安全的(尽管理论上printf
可以根据iostream
. 但是,除非您防止递归,否则任何使用 iostream、语言环境或标准容器的方法都已失效:
void*
operator new( size_t n )
{
static int recursionCount = 0;
++ recursionCount;
void* results = malloc() ;
// Any additional logic you need...
if ( recursionCount == 1 ) {
logAllocation( results, n );
}
-- recursionCount;
return results;
}
operator delete
形式上delete
,您应该为close()
.