C / C ++ распределение памяти строк

Я только недавно начал с разработки C / C ++ для встроенной системы (ARM — STM32F4, если быть более точным), и теперь у меня возникают почти классические проблемы с человеком, который не привык к C или низкоуровневому управлению памятью.

По сути, у меня есть класс MenuOption, который наследует какое-то поле от другого класса и в основном выглядит так:

...
char text[20];
...
void MenuOption::setText(const char* text1)
{
clearCurrent();
needsUpdate = true;

strncpy(text, text1, 20);
width = font->FontWidth*strlen(text);
}

Конструктор для этого класса вызывает этот метод setText для хранения текста. Это прекрасно работает, если я использую это так в основной функции:

std::vector<MenuOption *> mainMenuOptions;
MenuOption* op1 = new MenuOption(13, 15, "Info", WHITE, BLACK);
op1->setSelected(true);
mainMenuOptions.push_back(op1);

Но он терпит неудачу, когда я хочу использовать это так:

std::vector<MenuOption *> options;
for (int i = 0; i < things.size(); i++)
{
Thing *th = things[i];
... do some stuff with th ...
MenuOption* op = new MenuOption(190, 38+25*i, "test", WHITE, BLACK);
options.push_back(op);
}

Это терпит неудачу (отладочный вид остановок) на MenuOption* op ... линия. Теперь я предполагаю, что это не то, что я должен делать. Но я не могу найти рабочее решение.

РЕДАКТИРОВАТЬ:

Чтобы ответить на все вопросы. Фактически это компилируется с помощью компилятора C ++. GCC используя диалект C ++ 11.

Есть причина, по которой я использую строки C вместо std :: string. Я использую несколько C-библиотек, которые нуждаются в C-строках. И всякий раз, когда я пытался преобразовать эту строку в строку C внутри задачи FreeRTOS, эта вещь терпела неудачу. Та же проблема, что и сейчас на самом деле.

Никакая другая точка останова внутри задачи не сработает после достижения этой строки конструктора. Я не могу вмешаться или пропустить строку или что-то подобное в этой строке. У меня такое чувство, что его ловит обработчик прерываний hard_fault. Другие задачи будут продолжать выполняться. Это проблема. Там нет ошибок или что-то, что указало бы мне на причину. Та же проблема была, когда я использовал std :: string, когда пытался создать новый MenuOption внутри задачи FreeRTOS. Это работает, если я удаляю строку из конструктора. Так что я предполагаю, что это как-то связано со строками.

Что касается длины строки. Я знаю, что используемые здесь строки не будут длиннее 15 символов. Я использовал эти 5 символов для чистого «резервного копирования» —

Для ... do some stuff with th ... это было просто так: th->flag = true;, Я больше ничего не делал из-за этой проблемы.

2

Решение

Подсказка, опубликованная в комментариях Этьена, на самом деле и подтолкнула меня к ответу. Более конкретно я нашел это: http://www.freertos.org/FreeRTOS_Support_Forum_Archive/October_2013/freertos_Using_C_std_vector_in_task_93928e86j.html

void *operator new(size_t size)
{
void *p;

if(uxTaskGetNumberOfTasks())
p=pvPortMalloc(size);
else
p=malloc(size);

return p;
}

void operator delete(void *p)
{
if(uxTaskGetNumberOfTasks())
vPortFree( p );
else
free( p );

p = NULL;
}
1

Другие решения


По вопросам рекламы [email protected]