gpt4 book ai didi

C++ operator new 重载,编译错误

转载 作者:行者123 更新时间:2023-11-28 01:52:06 30 4
gpt4 key购买 nike

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

 ::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__)

那是违法的。根据标准,带有关键字 #defined 的程序对其他内容的行为是未指定的。你的程序格式错误,不需要诊断。

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

您的代码采用开始一个 placement new 表达式的裸 new,并将其替换为不同的 placement 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

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

关于C++ operator new 重载,编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42624942/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com