new 和 delete 被定义为Arduino发行版的一部分: /usr/share/arduino/hardware/arduino/cores/arduino/new.h :
new
delete
/usr/share/arduino/hardware/arduino/cores/arduino/new.h
/* Header to define new/delete operators as they aren't provided by avr-gcc by default Taken from http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=59453 */ #ifndef NEW_H #define NEW_H #include <stdlib.h> void * operator new(size_t size); void operator delete(void * ptr); __extension__ typedef int __guard __attribute__((mode (__DI__))); extern "C" int __cxa_guard_acquire(__guard *); extern "C" void __cxa_guard_release (__guard *); extern "C" void __cxa_guard_abort (__guard *); extern "C" void __cxa_pure_virtual(void); #endif
该 new.h 包括在内 Printable.h 所以你在Arduino基本包含中得到它。但是这些运算符在AVR Libc中没有定义。我对这些设计选择的解释:Libc人认为这是一个坏主意,而Arduino人则都是关于易用性:如果你想要的话 new 和 delete ,请他们。
new.h
Printable.h
如你所示, new 和 delete 的 做 强> 在Arduino原则上工作。问题是你的Arduino有2K的RAM用于全局变量,堆栈和堆 结合 所以你为它编写的任何实质性程序都必须高度了解内存使用情况。
因此,对于像这样的嵌入式系统,通常最好使用静态分配(或者在某些情况下可能是每类动态分配)而不是通用动态分配:对于简单程序,你不要这样做。 需要 动态分配,对于复杂的程序,你可以“ 给予 它。
仅仅因为平台没有预定义 operator new() 并不意味着 您 无法定义它。在你的代码中,大概有人会为分配函数编写一个定义,所以一切都很好。
operator new()
(我假设你已经熟悉了它之间的区别 new 表达式和分配函数,这是令人困惑的 operator new() 。)
这是一个婴儿示例定义,应该得到一个简短的程序:
char buf[1024]; char * cur = buf; void * operator new(std::size_t n) { char * res = cur; std::size_t inc = (n + 15) / 16 * 16; if (std::distance(cur, buf + sizeof(buf)) < inc) throw std::bad_alloc(); cur += inc; return res; } void operator delete(void * p) noexcept { }
这显然会很快耗尽内存。