在许多早期帖子中解释了重载删除。但是,我有一个特别的疑问,我想在下面描述。
我们有一个主要支持C的工具链。但是也有很少的cpp库允许我们有一定数量的cpp支持。
[]
如图所示,我们有一个主要计划,我们有相当多的控制权。该库由芯片供应商提供,我们需要与我的硬件集成。我们有处理器公司提供的API,我们需要使用它们。
我们需要使用API的主要原因是工具链无法识别operator new和delete。但是,文件<new>
存在于工具链的c ++部分并且有效。但是,工具链提供商表示他们不能保证这种内存分配的有效性。
当我们使用库创建的对象调用纯虚函数时,我遇到了关于Bad Value Address的问题。
硬件人员说我们需要使用他们的API来处理内存分配而不是"new"
和"delete"
。
我们能够成功地重载新功能,例如使用mynew.cc
我们将new定义为。
void* operator new( unsigned int size, const char *f, int line)
{
printf("the file :%s\n", f);
printf("the line: %d\n", line);
//if(0 == size)
// return 0;
void *ret = my_api_Malloc(size);
printf("the ret: %p\n", ret);
return ret;
}
我已在mynew.h
文件中声明了这一点,我将其包含在我的主要功能中。
我已经读过,我们不能重载全局删除。
我已在我的"mynew.cc"
文件中定义了删除
void operator delete(void * p)
{
printf("the file :%s\n", __FILE__);
printf("the line: %d\n", __LINE__);
my_api_Free(p);
};
我们可以在主程序中成功使用new operator
,即我们使用时,
myclass * obj = new myclass
,
重载的新品被替换。但是,当我们delete obj
时,没有任何事情发生。
如果我们必须使用delete
,我们需要将删除定义为
#define delete (x) (operator delete(x, __FILE__, __LINE__))
我们mynew.h
中的
在程序中我们必须调用delete(obj)
,这是我们无法做到的,因为回调函数不能替换为我们的代码更改。
请让我知道可以做些什么,以便我们可以成功使用删除。
答案 0 :(得分:2)
您只是实施了错误的operator new
。由于他们的代码没有使用new/delete
的宏,因此您应该提供void* operator new(std::size_t)
。
你确实无法重载 operator delete(void*)
,但那是术语。你替换它。
答案 1 :(得分:0)
如果专有库(由其供应商)在Failed to load resource: the server responded with a status of 404 (Not Found)
内联的上下文中编译,则表示您运气不佳。
但您可以使用::operator new
...
否则,我建议您覆盖(不&#34;重载&#34;)实施&#39;
nm -D
等...
(如MSalters's answer)。它不能是宏 ::operator new(std::size_t)
::operator delete(void*)
,因为专有库调用某些#define new
函数(不是宏,它在编译时扩展)。
BTW,堆管理是一个整个程序功能。除非您的代码和专有库代码被设计为接受自定义分配器,否则您的程序中实际上不能有多个分配器。
我建议尽可能使用valgrind,并使用::operator new
与最近的GCC进行编译(请参阅here关于g++ -Wall -g -fsanitize=address
)...如果在Linux上你可以使用-fsanitize
技巧。看起来您有一些undefined behavior,例如memory leaks。