c++ - 全局替换所有新运营商

标签 c++ new-operator

我在(嵌入式)C++ 应用程序中使用 RTOS。由于我正在处理嵌入式目标,因此我尽量将堆分配保持在最低限度。然而,在某些时候,像 vector 这样的 STL 类会派上用场。

因为我使用的是 RTOS,所以我必须确保 new/malloc() 调用是线程安全的。幸运的是,我的 RTOS (FreeRTOS) 提供了它自己的(线程安全的)malloc() 例程。我只需要使用它们。

到目前为止,我实现了以下新/删除对并将其链接到二进制文件中。

void * operator new(size_t n) noexcept(false);


void operator delete(void * p) noexcept(true);


void operator delete(void * p, size_t n) noexcept(true);

然而看着这个

https://en.cppreference.com/w/cpp/memory/new/operator_new

向我展示了十几个 new 重载(以及同样多的 delete 重载)。 所有新的或删除的重载都默认为我的替代品,还是我缺少运算符重载?

最佳答案

许多 operator newoperator delete 重载的标准库的默认行为是转发到 operator new< 的“基本”版本operator delete

“基本”运算符是:

void* operator new (std::size_t count);
void* operator new (std::size_t count, std::align_val_t alignment); // C++17 only
void operator delete(void* ptr) noexcept;
void operator delete(void* ptr, std::align_val_t alignment) noexcept; // C++17 only

假设您有一个标准库实现,它实现了 C++ 标准中定义的默认行为¹,上述运算符是您唯一需要替换的。

默认行为首先在 C++11 标准中定义,因此您的标准库实现必须至少支持这一点。

[1]:请参阅 C++ 标准中标题为“存储分配和释放 [new.delete]”的部分。

关于c++ - 全局替换所有新运营商,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55425724/

相关文章:

c++ - 对继承类隐藏名称

c++ - 如何在 WinApi C++ 包装器中处理消息

c++ - 存储模板类型以将Base转换回Derived <T>

c++ - c linux 和 windows 中的键盘扫描代码

c++ - 在类中分配过多动态内存时,Qt 会抛出错误

C++对象内存消耗

c++ - 如何在 C++ 中使用 new 分配内存?

附加到 DOM 的 jQuery 新元素不起作用

c++ - 使用 "new"后添加新对象

c++ - 为可变参数模板添加的新语法实体的名称是什么?