2017-03-06 47 views
0

当我重载新的运营商在全球范围内跟踪MEM泄漏,我得到的编译错误在以下地方C++运算符重载新,编译错误

::new(__tmp) _Rb_tree_node<_Val>; 

看起来他们分配,并填补了节点出现。 以下是错误:

/home/symbol/Android/Sdk/ndk-bundle/sources/cxx-stl/gnu-libstdc++/4.9/include/functional: In static member function 'static void std::_Function_base::_Base_manager<_Functor>::_M_clone(std::_Any_data&, const std::_Any_data&, std::true_type)':/home/symbol/Android/Sdk/ndk-bundle/sources/cxx-stl/gnu-libstdc++/4.9/include/functional:1870:9: error: '__dest' does not name a type 
new (__dest._M_access()) _Functor(__source._M_access<_Functor>()); 

下面是我的重载代码:

void* operator new(std::size_t sz,char const* file, int line){ 
return newImpl(sz,file,line); 
} 

void* operator new [](std::size_t sz,char const* file, int line){ 
return newImpl(sz,file,line); 
} 

void operator delete(void* ptr) noexcept{ 
auto ind=std::distance(myAlloc.begin(),std::find(myAlloc.begin(),myAlloc.end(),ptr) ); 
myAlloc[ind]= nullptr; 
free(ptr); 
} 

#define new new(__FILE__, __LINE__) 
+1

宏定义看起来不正确。生成预处理器输出以查看代码中该宏扩展的内容,这可能不是您所期望的。 –

+0

为什么你需要超载如果你使用宏呢?你可以用任何函数调用来替换'new' – Ap31

回答

2
#define new new(__FILE__, __LINE__) 

这是非法的。在该标准下,具有关键字#defined的程序的行为是未指定的。你的程序不合格,不需要diangostic。

如果你想知道为什么你打破这个特定的时间,那是因为C++标准库在它传递一个要构造的void指针的地方使用了placement new本身。

您的代码采用裸露的new开始展示位置新表达式,并用不同的展示位置新表达式替换它。然后让剩下的代码废话,因为我们得到:

new("some file", 1234) (some void pointer) some_type(constructor_args...) 

这是完全非法的语法。

如果您想要捕获99%的分配,请在创建std容器时重新创建代码以使用不同的分配器。扫一扫您的代码,将您的代码new替换为您可以合法地#define改为不同的东西(例如TRACED_NEWTRACED_NEW_PLACEMENT)。

在分配器使用这些。与使用分配器的货物更换的std::container一切都使用

一种方法是写自己的notstd命名空间模板别名更换分配器(或任何其他换装你想做的事)。这个自定义分配器然后可以使用您的TRACED_NEW_PLACEMENTTRACED_NEW

而结果是一个定义良好的程序,而不是目前最适用于当前编译器的破解程序。