繁体   English   中英

基本的新/删除操作员日志

Basic new/delete operator logging

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我想重载全局和非全局new / delete运算符以进行日志记录。

当我只想添加日志记录信息时,我想保留此运算符的标准行为。

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

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

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

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

2 个回复

您可以使用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的唯一函数是mallocfree 当然,很多人没有理由动态分配,而且我不必担心诸如memcpystrlen类的函数。 实际上,使用C库中的任何函数都可能是安全的(尽管从理论上讲,可以使用iostream来实现printf )。 但是,除非可以防止递归,否则对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进行相同的operator delete ,尽管在实践中,如果您要登录到文件,除了close()或析构函数之外,我不希望有任何delete

您可以重新定义new关键字以调用其他签名并传递__FILE__等。

在一般情况下,这可以解决。 当您开始使用覆盖operator new对象时,虽然有点麻烦。

如果我能通过记忆知道这一点,我会分享,但是您可能可以在Google上找到它。 我认为在某个地方的codeproject上有一个实现。

1 自动删除新操作员

我正在阅读wxWidgets教程: http : //docs.wxwidgets.org/trunk/overview_helloworld.html 而且我注意到他们使用new而不删除。 这怎么可能:S您如何在一个类上使用new而不删除它:S对我来说没有任何意义:l 有人可以解 ...

2013-05-29 17:38:18 5 785   c++
2 操作员如何“删除这个”呢?

我只是测试运算符“删除这个”。使用句柄系统调用“new / delete”将丢失一个覆盖删除函数调用。 句柄功能如下: 和测试类: 我打电话的时候 结果是: 错过了关于A(0x5642fc1c4e70)的删除调用,为什么? ...

3 Ansible 操作员日志

我们已经实现了 Ansible 操作符。 我们有一些错误,特别是当我们并行运行时。 当它们并行运行时,很难跟踪来自 ansible 容器的消息与消息相关的对象。 我想为 ansible 模块的输出生成的每个条目添加某种 ID。 直接的方法是修改每个模块执行以添加 ID,但这看起来不太好。 有没有更好 ...

4 新操作员做什么?

我试图弄清楚new作品是如何工作的: 1、2和3有什么区别? 为什么operator new给指针构造一个新位置,但不更改a->x的值? 但是,在调用new的第一个实例之前,它与调用new一次之后具有不同的值吗? ...

2014-12-31 14:47:45 7 117   c++
5 新操作员返回什么?

我是一个初学者,这个问题总是让我感到困惑。 我的学术书说新的操作员返回一个地址。 但是在许多教程中,我发现new返回一个指向特定地址的指针。 拿着它: 此处为名称分配了什么值,已动态分配的地址或指向动态分配的char的指针? 谢谢 ...

6 Arduino的新操作员

我被告知(特别是在Arduino上的C ++标准库 ,以及Stack Overflow问题C ++字符串和Arduino字符串中的答案 。如何组合它们? ))Arduino编译器没有实现new运算符。 但是,我已经为使用它的Arduino(在Arduino IDE中)编写了一个程序,它运行得很 ...

7 新操作员崩溃

我通过以下调用栈在新运算符上中止了信号6崩溃: 我最终可能会遇到什么原因? 我的机器的内存使用率非常低,大约为12GB的8%,我认为内存不是问题(核心转储约为700MB)。 新操作符已重载以使用malloc: ...

8 测试::操作员新

我试图实现这一点: 但是g ++(4.3.1)说: 难道我做错了什么? 如果是,是否有重载要在我的课程中使用的新运算符? 我不想创建一个基类并使我的所有类都从该基类继承。 ...

2009-10-14 18:35:08 3 1048   c++
9 删除操作员混乱

因此,我发现此技术是所有浏览器中全局.remove()方法的解决方法。 a.outerHTML =''; delete a a =您的元素。 我的问题..这使我非常困惑,因为它仅在我使用externalHTML ='';时才有效。 但是,删除操作符在这里说https://de ...

10 关于删除,删除[],操作员删除()等[复制]

可能重复: delete []“如何”知道操作数数组的大小? (POD)释放内存:删除[]等于删除? 据我了解,以下内容 首先会调用operator new() (全局的,或A提供的专用的)来分配适当的内存量,然后调用A的构造函数。当调用delete时,将会首先调用A ...

2010-09-02 09:21:47 1 640   c++
暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM