gpt4 book ai didi

c++ - 在特定程序中重载删除

转载 作者:搜寻专家 更新时间:2023-10-31 02:18:13 24 4
gpt4 key购买 nike

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

我们有一个主要支持 C 的工具链。但是也有一些 cpp 库,这使我们能够获得一定数量的 cpp 支持。

[ The problem Statement ]

如图所示,我们有一个主程序,我们可以对其进行相当程度的控制。该库由芯片供应商提供,我们需要将其与我的硬件集成。我们有我们需要使用的处理器公司提供的 API。我们需要使用我们的 API 的主要原因是工具链无法识别 operator new 和 delete。但是,文件 <new>存在于工具链的 c++ 部分并且有效。但是,工具链提供商表示他们不能保证这种内存分配的有效性。当我们使用库创建的对象调用纯虚函数时,我遇到了一个关于错误值地址的问题。硬件人员说我们需要使用他们处理内存分配的 API 而不是 "new""delete" .我们能够像通过 mynew.cc 一样成功地重载 new我们将 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我们需要将 delete 定义为类似

#define delete (x) (operator delete(x, __FILE__, __LINE__))

在我们的 mynew.h在程序中我们必须调用 delete(obj) ,我们不能这样做,因为回调函数无法用我们的代码更改替换。

请让我知道如何才能成功使用删除。

最佳答案

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

您确实不能重载 operator delete(void*) 但那是术语。您替换它。

关于c++ - 在特定程序中重载删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34757361/

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