基本的新建/删除操作员日志记录
Basic new/delete operator logging
我想重载全局和非全局的new/delete运算符以进行日志记录。
由于我只是想添加日志信息,所以我希望保留这些操作符的标准行为。
有没有一种方法可以重载新的/delete操作符来添加日志记录,但不必重写标准行为(这可能很容易出错)?
事实上,我不仅需要规范的行为。我需要与Visual 2010实现相同的行为,这可能不是标准的。
我在这种日志记录中寻找的错误类型是新的[]/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
的失败,因为我想测试我的代码对它的反应也正确)。
如果您正在进行日志记录,请非常小心,避免无休止的递归。唯一保证不在标准库中使用operator new
的函数分别为CCD_ 8和CCD_。当然,很多人没有理由分配动态,并且我不担心像memcpy
或CCD_ 11。在实践中,使用任何函数都可能是安全的在C库中(尽管理论上printf
可以在iostream
的术语)。但是iostream、locale或标准的任何使用容器已用完,除非您防止递归:
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
除了在CCD_ 16或析构函数中。
您可以重新定义new
关键字以调用不同的签名并传递__FILE__
等。
在一般情况下,这是可以的。当你开始使用覆盖operator new
的对象时,尽管你有点搞砸了自己。
如果我凭记忆知道的话,我会分享,但你可能可以在谷歌上找到。我认为某个地方有一个代码项目的实现。
- EvtExportLogneneneba API正在将远程计算机的事件日志保存到远程PC本身.如何将其保存到主机
- <<操作员在下面的行中工作
- C++ 与操作员不匹配<<
- 操作员C++的模棱两可的过载
- 是否可以配置提升日志刷新?
- C++中>>操作员过载时出现问题?
- NaN 上的宇宙飞船操作员
- 跟踪日志中的T.11803()是什么意思?
- 加快在C++中读取/处理日志文件的速度
- 如何将消息时间戳写入日志文件?
- 比根<操作员
- 分析包含 NMEA 句子的日志文件C++
- SFINAE不能防止模棱两可的操作员过载吗?
- 什么是现实中的"endl"(或任何输出操纵器)?它是如何实现的,它如何与操作员<<一起工
- 如何修复输出日志中的"EnableInput can only be specified on a Pawn for its Controller"错误
- 如何实现具有多个平台__FILE__和__LINE__信息的 C/C++ 可变参数日志记录宏?
- Log4net,将日志消息从 c++ dll 发送到 c# 应用程序?
- 返回ERROR_INVALID_PARAMETER的事件日志函数
- 为什么"delete"操作员给我访问权限冲突
- 基本的新建/删除操作员日志记录