首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++中新操作符的旁路覆盖

C++中新操作符的旁路覆盖
EN

Stack Overflow用户
提问于 2013-05-14 09:34:32
回答 1查看 1.6K关注 0票数 5

是否有一种方法可以绕过operator new的覆盖?

就像这样:

代码语言:javascript
复制
void* ::operator new( std::size_t size ) {
    void *p = ( ::operator new( size ) );  // But original, _not_ infinite recursion
    // do stuff with p
    return p; 
}

背景:我有一些遗留代码,我们最近切换到用Visual 2012进行编译。现在,当malloc无法_heap_alloc足够的内存块时,就会出现随机崩溃。(是的,代码中到处都是小内存泄漏和其他不良行为。但不幸的是,彻底的清理是不现实的,它大约在50万SLOC左右。

我目前的理论是,原因是几乎所有的源文件都包含具有以下重写operator new的头文件:

代码语言:javascript
复制
void* ::operator new( std::size_t size ) {
    void* p = malloc( size );
    if( p == NULL )
        throw;
    // set memory to zero
    memset( p, 0, size );
    return p;
};

void* ::operator new[]( size_t count ) throw(std::bad_alloc) {
    // try to allocate count bytes for an array
    return (operator new(count));
}

没有覆盖delete

本质上,这意味着应用程序将使用malloc的分配与使用delete而不是free的去分配混合在一起。

首先尝试Q&D修复:引入对使用deletefree的重写。但这只是部分的帮助,因为有时包括order和链接库仍然会使它变得一团糟。

第二,尝试Q&D修复:删除覆盖。但不幸的是,将内存初始化为0是必要的。使用的是一个老编译器的传统,它总是这样做的,而假定C++的编码器总是这样做的。

我知道new()会处理这个问题,但不幸的是,在不手动遍历所有源代码并对其进行更新的情况下,我不知道有任何好的方法来使用它。它也无助于实现得不好的类,这些类假设它们的所有成员都是空的,而没有在构造函数中这样做。

因此,我对Q&D修复的第三个想法是:在覆盖中使用正常的新方法,正如这个问题所问的那样。

EN

回答 1

Stack Overflow用户

发布于 2013-05-14 11:27:30

是否有办法实现对操作符新的覆盖的旁路?

据我所知,没有,但是为什么不简单地在您的自定义函数中重新实现它,就像MS在基于它们的_heap_alloc实现中那样,并将您的定制添加到其中呢?

不管怎么说,一种死去活来的分配尝试不是MS所做的:

http://msdn.microsoft.com/en-us/library/vstudio/we2zys4d.aspx

默认行为是执行一个循环。在循环中,函数首先尝试分配请求的存储空间。

不管怎么说-我是第二名。发表评论

您需要修复真正的内存错误。

这是自我解释;为了那些调试目的,请看一看std::set_new_handler。

顺便说一句,有些事情让我对你的代码感到恼火

  • 经营者的明确资格
  • 不是抛std::bad_alloc,而是在catch块之外重新抛出

黑客行动愉快!

你好,S.

@所有:我不能“投票”这个问题,因为我在这里的活动有限,但我建议这样做。这是一个非常有趣的话题,也是一个很好的表述。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16539694

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档