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

标签 c++ string stm32

我最近才开始在嵌入式系统(更具体地说是 ARM - STM32F4)上进行 C/C++ 开发,现在我遇到了一些不习惯 C 或低级内存管理的人的几乎经典问题。

基本上我有一个 MenuOption 类,它从其他类继承了一些字段,基本上看起来像这样:

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

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

此类的构造函数调用 setText 方法来存储文本。如果我在 main 函数中像这样使用它,效果很好:

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++ 编译器编译的。使用 C++11 方言的 GCC。

我使用 C 字符串而不是 std::string 是有原因的。我正在使用一些需要 C 字符串的 C 库。每当我试图在 FreeRTOS 任务中将该字符串转换为 C 字符串时,事情就会失败。实际上和现在一样的问题。

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

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

至于 ... 用 th ... 做一些事情 就是这样:th->flag = true;。由于这个问题,我没有对它做更多的事情。

最佳答案

É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;
}

关于c++ - C/C++字符串内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24397238/

相关文章:

php - 将字符串编码为字符代码

几次立即重置后闪存损坏

C++:合并排序和插入排序混合

c++ - C和C++有什么关系(比较技术性的做法)

c++ - 当超过 12 个线程时,pthread_create 段错误?

c++ - C++宏中的字符串修改

带捕获组的 C++ 正则表达式字符串文字

c++ - Visual C++ 和超长字符串

c - 编译器是否在作用域中使用堆栈变量的相对地址?

arm - 补偿ARM中断的延迟?