使用String参数direct vs variable调用函数

时间:2017-01-27 17:13:37

标签: c++ string arduino esp8266

我遇到了一个问题我不太懂得使用ESP8266 core for Arduino在ESP8266上开发软件。基本上,如果我传递在调用函数时创建的String,我的程序会崩溃。我有一个String作为参数的函数:

void SimpleFunc(String str)
{
    ...
}

我尝试了两种使用非常长的String调用此函数的方法。 第一种方式是创建一个新的String变量并传递它:

String veryLongString = "veeeerryyyy loooong ........."; //Much longer  in reality!!!
SimpleFunc(veryLongString);

第二种方式是直接传递String

SimpleFunc("veeeerryyyy loooong .........");

运行第二个草图会导致崩溃。这是堆栈的一部分:

  

umm_assimilate_up at ... \ esp8266 \ 2.3.0 \ cores \ esp8266 \ umm_malloc / umm_malloc.c line 1163

     

String ::〜String()位于... \ esp8266 \ 2.3.0 \ cores \ esp8266 / WString.cpp第720行

     

_umm_free at ... \ esp8266 \ 2.3.0 \ cores \ esp8266 \ umm_malloc / umm_malloc.c line 1287

     

免费在... \ esp8266 \ 2.3.0 \ cores \ esp8266 \ umm_malloc / umm_malloc.c第1733行

     

String ::〜String()位于... \ esp8266 \ 2.3.0 \ cores \ esp8266 / WString.cpp第720行

以这种方式调用函数的区别在哪里?为什么第一种方法运作良好而第二种方法没有?

1 个答案:

答案 0 :(得分:3)

如果您通过引用来调用字符串

  void foo(std::string const &str)

不会制作基础角色的副本。如果按值调用

  void food(std::string str)

str被复制,如果它很长是一项昂贵的操作,可能会使机器内存不足。