Я пытаюсь разместить два экземпляра объекта mbed :: BufferedSerial в куче на nrf52840. Первое распределение выполнено успешно, и первый экземпляр последовательного порта работает нормально, однако после создания второго экземпляра объекта последовательного порта первый экземпляр перестает работать. Отладка показывает, что второй объект перезаписывает 16 последних байтов первого объекта в памяти. Причина в том, что, хотя sizeof (объект BufferedSerial) составляет 856 байт, оператор new выделяет только 840 байт, и, следовательно, последние 16 байтов перезаписываются при следующем выделении кучи.
Переданный параметр count равен 840B: operator new (std :: size_t count)
Размер объекта после создания 856B: sizeof (* g_serial_port [0])
Кто-нибудь знает, почему это происходит и как исправить Это? Фрагмент кода, который выполняет распределение, выглядит просто следующим образом (скомпилирован с помощью GNU Tools Arm Embedded 9 2019-q4-major):
serial_api. cpp
static mbed::BufferedSerial *g_serial_port[2] =
{ NULL };
extern “C” void create(id, tx , rx)
{
g_serial_port[id] = new mbed::BufferedSerial(tx, rx);
}
main. c
int main()
{
create(0, P1_14, P1_15); //the heap allocated is 16 bytes smaller than the object
create(1, P1_12, P1_13); // this object's allocation overwrites the last 16 bytes of the previous one.
…
}