gpt4 book ai didi

c++ - 基本的新/删除运算符(operator)日志记录

转载 作者:搜寻专家 更新时间:2023-10-31 01:13:31 25 4
gpt4 key购买 nike

我想重载全局和非全局的新/删除运算符以进行日志记录。

因为我只想添加日志信息,所以我想保留此运算符的标准行为。

有没有一种方法可以重载 new/delete 运算符来添加日志记录,而不必重写标准行为(这可能容易出错)?

其实,我不仅需要标准的行为。我需要与 Visual 2010 实现相同的行为,这可能不是标准的。

我正在使用这种日志记录寻找的错误类型是 new[]/delete 不匹配。

我可以使用经典工具,但它们会减慢执行速度,我想与其他人共享二进制文件以收集更多信息。

最佳答案

您可以使用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 失败,因为我想测试我的代码也能正确 react )。

如果您正在记录日志,请务必小心避免无休止的递归。唯一的保证不使用标准库中的 operator new 的函数是 mallocfree。当然,很多没有理由分配动态地,我不担心像 memcpystrlen。实际上,您可能对任何功能都是安全的在 C 库中(虽然理论上,printf 可以在iostream 条款)。但任何使用 iostream、语言环境或标准containers 已经出局,除非你防止递归:

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() 或析构函数中。

关于c++ - 基本的新/删除运算符(operator)日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12403141/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com