在C中绕过操作符new的覆盖

有没有办法绕过运算符new的覆盖?

像这样的东西:

void* ::operator new( std::size_t size ) {
    void *p = ( ::operator new( size ) );  // But original, _not_ infinite recursion
    // do stuff with p
    return p; 
}

背景:
我有一些遗留代码,我们最近使用Visual Studio 2012进行了编译.现在,当malloc无法_heap_alloc足够的内存块时,我们会发生随机崩溃. (是的,代码中充斥着小内存泄漏和其他不良行为.但不幸的是,彻底清理是不现实的,它大约有50万SLOC.)

我目前的理论是,原因是几乎所有的源文件都包含一个标题,其中包含以下operator new的覆盖:

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));
}

没有删除的覆盖.

实质上,这意味着应用程序使用malloc与使用delete而不是free的deallocation混合分配.

首先尝试Q& D修复:
介绍使用免费的删除覆盖.但这只是部分有帮助,因为有时包括订单和链接库仍然搞砸了.

第二次尝试Q& D修复:
删除覆盖.但遗憾的是,将内存初始化为0是必要的.使用旧编译器的遗产,总是这样做,而假设C的编码器将始终这样做.

我知道new()会处理这个问题,但不幸的是,我不知道有什么好方法可以使用它而无需手动浏览所有源代码并更新它.它对于实现不好的类也无济于事,这些类假定所有成员在构造函数中没有这样做而无效.

因此,我对Q& D的第三个想法是:
正如这个问题所述,使用覆盖中的普通new.

最佳答案

Is there a way to achieve a bypass of an override of operator new?

没有我知道的,但为什么不简单地在你的自定义函数中重新实现它,就像MS在基于_heap_alloc的实现中所做的那样,只是添加你的自定义?

无论如何,一个或多个分配尝试不是MS所做的:

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

The default behavior is to execute a loop. Within the loop, the
function first attempts to allocate the requested storage

无论如何 – 我是第二个.发表评论

You need to fix real memory bugs

这是自我解释;对于那些任何调试目的 – 请看看std :: set_new_handler.

顺便说一句 – 有些事我觉得你的代码很烦人

>操作符的明确资格
>不要抛出std :: bad_alloc,而是重新抛出catch-block

快乐黑客!

问候,S.

P.S.:@all:由于我在这里的限制,我不能“投票”这个问题,但我建议这样做.这是一个非常有趣的话题,并且制定得很好.

点赞