Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
全球更换所有新操作员 我在一个(嵌入式)C++应用程序中使用RTOS。因为我正在处理一个嵌入式目标,所以我尝试将堆分配保持在最小值。然而,在某些情况下,像vector这样的STL类非常方便_C++_New Operator - Fatal编程技术网

全球更换所有新操作员 我在一个(嵌入式)C++应用程序中使用RTOS。因为我正在处理一个嵌入式目标,所以我尝试将堆分配保持在最小值。然而,在某些情况下,像vector这样的STL类非常方便

全球更换所有新操作员 我在一个(嵌入式)C++应用程序中使用RTOS。因为我正在处理一个嵌入式目标,所以我尝试将堆分配保持在最小值。然而,在某些情况下,像vector这样的STL类非常方便,c++,new-operator,C++,New Operator,因为我使用的是RTOS,所以我必须确保new/malloc()调用是线程安全的。幸运的是,我的RTOS(FreeRTOS)提供了自己的(线程安全的)malloc()例程。我只需要使用它们 到目前为止,我实现了以下new/delete对,并将其链接到二进制文件中 void * operator new(size_t n) noexcept(false); void operator delete(void * p) noexcept(true); void operator delete(

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

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

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);
但是看看这个,

显示了十几个new重载(以及用于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++中的存储分配和解除分配[No.Dele]”部分。< /P>分配的东西的每个STL类都提供一个模板参数来指定使用的分配器:<代码>模板>类T,类分配器= STD::分配器>类向量;<代码>为什么您认为标准分配函数不是线程安全的?您需要替换程序使用的所有运算符

new
(以及相应的运算符
delete
)的重载。你可能会很幸运,但没有特别的保证一个操作符
new
会默认调用另一个操作符。在担心线程安全分配器/释放定位器之前,我会认真考虑一下,系统是否可以设计为避免动态分配和释放(例如,在启动期间、启动线程之前分配,以及在所有启动的线程完成后取消分配)-即使使用线程安全,动态分配和取消分配也会产生不确定性通常,在嵌入式系统中,
operator new
仅定义为调用
malloc
(例如,在Arduino中,
new
new[]
都是这样定义的,这反过来又使得使用
new[]
分配和使用
delete
错误解除分配变得安全但不可移植。)。在执行on calls之前,您应该检查发生了什么。不幸的是,还有另一个问题。如果我尝试使用默认的新操作符分配大量数据,就会抛出一个硬错误。这实际上是我更换新操作符的主要目的。是的,在我的嵌入式系统上,new只是对malloc的调用,而不是t线程安全。所以基本上你是说我不能确定特定STL类实际使用的是哪个新操作符?分配器类型总是设置为std::Allocator