C / C ++字符串内存分配

时间:2014-06-24 22:14:17

标签: c++ string stm32

我刚刚开始在嵌入式系统上进行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库。每当我尝试将该字符串转换为FreeRTOS任务中的C字符串时,事情就会失败。实际上和现在一样的问题。

任务中的其他断点在到达该构造函数行后不会触发。我不能介入或跳过该行或类似的那一行。我有一种感觉它被hard_fault中断处理程序捕获。其他任务将继续运行。那就是问题所在。没有任何错误或任何可以指向我的事情。当我尝试在FreeRTOS任务中创建一个新的MenuOption时,我使用std :: string时出现同样的问题。如果我从构造函数中删除字符串,那就可以了。所以我猜它与字符串有关。

字符串长度。我知道这里使用的字符串不会超过15个字符。我使用这5个字符进行纯粹的“备份” -

至于... do some stuff with th ...就是这样:th->flag = true;。由于这个问题我没有做更多的事情。

1 个答案:

答案 0 :(得分:1)

Étienne在评论中发布的提示实际上是让我得到答案的原因。更具体地说,我发现了这个: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;
}