繁体   English   中英

C ++运算符新的重载,编译错误

[英]C++ operator new overloading, compilation error

当我全局重载新运算符以跟踪内存泄漏时,在以下位置出现编译错误

 ::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__)
#define new new(__FILE__, __LINE__)

那是非法的。 根据该标准,未指定带有关键字#define d的程序的行为。 您的程序格式错误,不需要使用英语。

如果您想知道为什么要中断这个特定时间,那是因为C ++标准库使用了placeplace new本身,并在其中传递了要构造的void指针。

您的代码采用了裸露的new ,该内容开始了一个placement new表达式,并将其替换为其他的placement new exprsion。 然后,剩下的代码变得毫无意义,就像我们得到的那样:

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

结果是定义良好的程序,而不是目前只能与当前编译器一起使用的hack。

暂无
暂无

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

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