【问题标题】:Modifying new operator using my API使用我的 API 修改新运算符
【发布时间】:2016-01-09 03:20:31
【问题描述】:

我想用处理器的自定义API修改工具链中的newdelete运算符。 有一些内存分配问题,所以供应商说我必须像这样修改它们。 在工具链中,我转到名为“new”的头文件 并检查了这些

void* operator new(std::size_t) throw (std::bad_alloc);
void* operator new[](std::size_t) throw (std::bad_alloc);
void operator delete(void*) throw();
void operator delete[](void*) throw();

我想做一些类似使用的事情

using namespace std;  
if( size == 0 )  
    size = 1;  
while( true ){  
    void* pMem = my_api_malloc(size);  
    if( pMem )      
        return pMem;  
}

这是正确的方法吗? 我可以在my_api_malloc 是我应该使用的地方做出这样的改变吗? 这是因为处理器主要使用 C,而无法识别 C++ 运算符。

【问题讨论】:

  • 欢迎来到 Stack Overflow。请尽快阅读About 页面。请使用c++ 标签和c 标签做not 标签问题。虽然偶尔在某些情况下两者都使用是正确的,但这不是其中之一——C 中没有 new 运算符,因此也无法修改它。
  • 对不起,下次我会记住的。我将 C 标记为我的处理器支持 C 而不是 c++。
  • 如果程序中有任何 C++ 代码,则需要 C++ 支持库,其中包括 newdelete 运算符。您的代码片段不在函数内;它可能是某种new 运算符。您尚未显示建议​​的替换 delete 运算符。这可能是一个合理的基础——如果my_api_malloc() 不断地返回一个空指针会发生什么还不清楚。该标准对new 操作员应该做什么有一些要求;您需要阅读并处理这些内容。
  • 感谢乔纳森先生。我想在 new(std::size_t) throw (){ using namespace std; 中添加片段如果(大小 == 0)大小 = 1; while( true ){ void* pMem = my_api_malloc (size); if( pMem ) 返回 pMem;
  • 我已经在inline void* operator new(std::size_t, void* __p) throw() { my fragment } @JonathanLeffler 中替换了我的代码片段

标签: c++ memory-management new-operator delete-operator


【解决方案1】:

抱歉,由于缺乏声誉,无法在评论中写下这篇文章。我认为您不应该在 while 循环中执行 malloc。如果操作系统无法为进程分配更多内存,那么无论您如何执行 malloc,都是徒劳的。另外请注意不要free new 在 C++ 中创建的内容,而不是 delete malloc 创建的内容。

C 中的内存分配

int *a = (int*)malloc(sizeof(int)*n);
if(!a)
  return 1;

在 C++ 中

try{
  int *a= new int[n];
}
catch (std::bad_alloc &e){
  // ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-11
    • 1970-01-01
    相关资源
    最近更新 更多