全球取代所有新运营商

问题描述 投票:1回答:1

我在(嵌入式)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

向我展示了十几个新的重载(以及删除的多次重载)。是否所有新的或删除重载默认为我的替换或我错过了运算符重载?

c++ new-operator
1个回答
1
投票

许多operator newoperator delete重载的标准库的默认行为是转发到operator newoperator 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]”的部分。

© www.soinside.com 2019 - 2024. All rights reserved.