我在(嵌入式)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 new
和 operator 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/