重载删除在许多较早的帖子中解释。不过,我有一个具体的疑问,我想在下面描述。重载删除,在特定程序中
我们有一个主要支持C的工具链。但是也有很少的cpp库允许我们拥有一定数量的cpp支持。
[]
由于图片表明,我们对我们有控制的相当数量的主节目。该库由芯片供应商提供,我们需要将其与我的硬件集成。我们有我们需要使用的处理器公司提供的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)
,其作为回调函数不能是我们不能做方案替换为我们的代码更改。
请让我知道可以做些什么,以便我们可以成功地使用删除。
请编辑你的问题**解释**为什么**你需要有你自己的堆分配和释放! –
我仍然不明白(即使在你编辑之后)为什么你需要自己的堆分配。您可能应该与您的专有库供应商支持 –
讨论,当我们使用纯虚函数时,我们遇到了与vtable有关的问题。工具链提供商说它的虚拟问题,这就是为什么你的程序在运行时崩溃(编译成功)。他要求我们用他们的内存分配和其他一些问题来修改我们的程序。取代新的和删除就是其中之一。工具链提供商并没有提供帮助,图书馆供应商也指责工具链。 – Kedar