Неверный размер динамической c памяти, выделенной для объекта Mbed BufferedSerial - PullRequest
0 голосов
/ 03 августа 2020

Я пытаюсь разместить два экземпляра объекта 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.
    …
}

1 Ответ

1 голос
/ 05 августа 2020

Комментарий Дэвида Шварца дал мне ключ к поиску несоответствующих определений MACRO препроцессора. Проблема заключалась в макросе препроцессора DEVICE_SERIAL_F C. Когда mbed был построен как библиотека, макрос был включен. Однако, когда в проекте использовалась библиотека и ее файлы заголовков, она была отключена. Это несоответствие вызвало проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...