2016-01-13 29 views
2

重载删除在许多较早的帖子中解释。不过,我有一个具体的疑问,我想在下面描述。重载删除,在特定程序中

我们有一个主要支持C的工具链。但是也有很少的cpp库允许我们拥有一定数量的cpp支持。

[The problem Statement]

由于图片表明,我们对我们有控制的相当数量的主节目。该库由芯片供应商提供,我们需要将其与我的硬件集成。我们有我们需要使用的处理器公司提供的API。 我们需要使用我们的API的主要原因是工具链不能识别操作符new和delete。但是,文件<new>存在于工具链的C++部分并且可以工作。但是,工具链提供商说他们不能保证这种内存分配的有效性。 当我们使用库创建的对象调用纯虚函数时,我面临着一个关于不良值地址的问题。 硬件人说我们需要使用他们的API来处理内存分配,而不是"new""delete"。 我们可以成功重载新版本,就像我们在其中定义新版本的mynew.cc一样。

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

请编辑你的问题**解释**为什么**你需要有你自己的堆分配和释放! –

+0

我仍然不明白(即使在你编辑之后)为什么你需要自己的堆分配。您可能应该与您的专有库供应商支持 –

+0

讨论,当我们使用纯虚函数时,我们遇到了与vtable有关的问题。工具链提供商说它的虚拟问题,这就是为什么你的程序在运行时崩溃(编译成功)。他要求我们用他们的内存分配和其他一些问题来修改我们的程序。取代新的和删除就是其中之一。工具链提供商并没有提供帮助,图书馆供应商也指责工具链。 – Kedar

回答

2

你只是执行了错误的operator new。由于他们的代码没有使用宏的new/delete,所以您应该提供void* operator new(std::size_t)

你确实不能过载operator delete(void*)但这是术语。你代替吧。

0

如果专有库是在::operator new内联的情况下编译的(由其供应商提供),那么您运气不好。

但你可能会检查使用nm -D ...

否则,我会建议你覆盖 “过载”)实施的

::operator new(std::size_t) 
::operator delete(void*) 

等等

(如MSalters's answer)。它不能是一个宏#define new,因为专有库是,调用某些::operator new函数(不是宏,它们在编译时展开)。

顺便说一句,堆管理是一个整个程序功能。除非您的代码和专有库代码被设计为接受自定义分配器,否则您的程序中实际上不会有多个分配器。

我建议尽可能使用valgrind并编译最近GCC与g++ -Wall -g -fsanitize=address(见here-fsanitize)...如果在Linux上,你可以使用LD_PRELOAD技巧。它看起来像你有一些undefined behavior,如memory leaks

+0

非常感谢您的宝贵建议。将执行这些步骤并检查问题。 – Kedar