是否有一种方法可以绕过operator 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 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));
}没有覆盖delete。
本质上,这意味着应用程序将使用malloc的分配与使用delete而不是free的去分配混合在一起。
首先尝试Q&D修复:引入对使用delete的free的重写。但这只是部分的帮助,因为有时包括order和链接库仍然会使它变得一团糟。
第二,尝试Q&D修复:删除覆盖。但不幸的是,将内存初始化为0是必要的。使用的是一个老编译器的传统,它总是这样做的,而假定C++的编码器总是这样做的。
我知道new()会处理这个问题,但不幸的是,在不手动遍历所有源代码并对其进行更新的情况下,我不知道有任何好的方法来使用它。它也无助于实现得不好的类,这些类假设它们的所有成员都是空的,而没有在构造函数中这样做。
因此,我对Q&D修复的第三个想法是:在覆盖中使用正常的新方法,正如这个问题所问的那样。
发布于 2013-05-14 11:27:30
是否有办法实现对操作符新的覆盖的旁路?
据我所知,没有,但是为什么不简单地在您的自定义函数中重新实现它,就像MS在基于它们的_heap_alloc实现中那样,并将您的定制添加到其中呢?
不管怎么说,一种死去活来的分配尝试不是MS所做的:
http://msdn.microsoft.com/en-us/library/vstudio/we2zys4d.aspx
默认行为是执行一个循环。在循环中,函数首先尝试分配请求的存储空间。
不管怎么说-我是第二名。发表评论
您需要修复真正的内存错误。
这是自我解释;为了那些调试目的,请看一看std::set_new_handler。
顺便说一句,有些事情让我对你的代码感到恼火
黑客行动愉快!
你好,S.
@所有:我不能“投票”这个问题,因为我在这里的活动有限,但我建议这样做。这是一个非常有趣的话题,也是一个很好的表述。
https://stackoverflow.com/questions/16539694
复制相似问题