C++ 使用字符串参数direct vs variable调用函数

C++ 使用字符串参数direct vs variable调用函数,c++,string,arduino,esp8266,C++,String,Arduino,Esp8266,我遇到了一个问题,我不太理解在ESP8266上使用开发软件。基本上,如果我传递调用函数时创建的字符串,我的程序就会崩溃。我有一个参数为字符串的函数: void SimpleFunc(String str) { ... } 我尝试了两种使用非常长的字符串调用此函数的方法第一种方法是创建一个新的字符串变量并传递它: String veryLongString = "veeeerryyyy loooong ........."; //Much longer in rea

我遇到了一个问题,我不太理解在ESP8266上使用开发软件。基本上,如果我传递调用函数时创建的
字符串,我的程序就会崩溃。我有一个参数为
字符串的函数:

void SimpleFunc(String str)
{
    ...
}
我尝试了两种使用非常长的
字符串调用此函数的方法第一种方法是创建一个新的
字符串
变量并传递它:

String veryLongString = "veeeerryyyy loooong ........."; //Much longer  in reality!!!
SimpleFunc(veryLongString);
第二种方法是直接传递
字符串

SimpleFunc("veeeerryyyy loooong .........");
运行第二个草图会导致崩溃。以下是堆栈的一部分:

在…\esp8266\2.3.0\cores\esp8266\umm\u malloc/umm\u malloc.c第1163行,将umm\u同化

字符串::~String()位于…\esp8266\2.3.0\cores\esp8266/WString.cpp第720行

_umm_免费在…\esp8266\2.3.0\cores\esp8266\umm_malloc/umm_malloc.c第1287行

免费访问…\esp8266\2.3.0\cores\esp8266\umm_malloc/umm_malloc.c第1733行

字符串::~String()位于…\esp8266\2.3.0\cores\esp8266/WString.cpp第720行


这种方式调用函数的区别在哪里?为什么第一种方法运行良好,而第二种方法运行不正常?

如果通过引用调用字符串

  void foo(std::string const &str)
不复制基础字符。如果你按价值观打电话

  void food(std::string str)

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

如果通过引用调用字符串

  void foo(std::string const &str)
不复制基础字符。如果你按价值观打电话

  void food(std::string str)
str被复制,如果它很长,这是一个昂贵的操作,可能会使机器内存不足