在特定程序中重载删除

时间:2016-01-13 02:24:00

标签: c++ delete-operator

在许多早期帖子中解释了重载删除。但是,我有一个特别的疑问,我想在下面描述。

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

[The problem Statement]

如图所示,我们有一个主要计划,我们有相当多的控制权。该库由芯片供应商提供,我们需要与我的硬件集成。我们有处理器公司提供的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),这是我们无法做到的,因为回调函数不能替换为我们的代码更改。

请让我知道可以做些什么,以便我们可以成功使用删除。

2 个答案:

答案 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