调用具有字符串参数direct vs variable的函数

Call of a function with String parameter direct vs variable

本文关键字:vs variable 函数 direct 参数 字符串 调用      更新时间:2023-10-16

我遇到了一个问题,我真的不理解在ESP8266上使用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_assilate_up在。。。\esp8266\2.3.0\cores\esp8266\umm_malloc/um_malloc.c线1163

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

_umm_free在。。。\esp8266\2.3.0\cores\esp8266\umm_malloc/um_malloc.c线1287

免费时间。。。\esp8266\2.3.0\cores\esp8266\umm_malloc/um_malloc.c线1733

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

以这种方式调用函数有什么区别?为什么第一种方法有效,而第二种方法无效?

如果通过引用调用字符串

void foo(std::string const &str)

不复制基础字符。如果您按价值调用

void food(std::string str)

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