调用带有字符串参数的函数直接与变量
Call of a function with String parameter direct vs variable
我 运行 遇到了一个问题 我不太了解使用 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.3.0\cores\esp8266\umm_malloc/umm_malloc.c line 1163
String::~String() at ...\esp8266.3.0\cores\esp8266/WString.cpp line 720
_umm_free at ...\esp8266.3.0\cores\esp8266\umm_malloc/umm_malloc.c line 1287
free at ...\esp8266.3.0\cores\esp8266\umm_malloc/umm_malloc.c line 1733
String::~String() at ...\esp8266.3.0\cores\esp8266/WString.cpp line 720
这样调用函数有什么区别?为什么第一种方法效果好而第二种方法效果不好?
如果通过引用调用字符串
void foo(std::string const &str)
没有制作底层字符的副本。如果按值调用
void food(std::string str)
str 被复制,如果它很长是一个昂贵的操作,可能 运行 机器内存不足。
我 运行 遇到了一个问题 我不太了解使用 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.3.0\cores\esp8266\umm_malloc/umm_malloc.c line 1163
String::~String() at ...\esp8266.3.0\cores\esp8266/WString.cpp line 720
_umm_free at ...\esp8266.3.0\cores\esp8266\umm_malloc/umm_malloc.c line 1287
free at ...\esp8266.3.0\cores\esp8266\umm_malloc/umm_malloc.c line 1733
String::~String() at ...\esp8266.3.0\cores\esp8266/WString.cpp line 720
这样调用函数有什么区别?为什么第一种方法效果好而第二种方法效果不好?
如果通过引用调用字符串
void foo(std::string const &str)
没有制作底层字符的副本。如果按值调用
void food(std::string str)
str 被复制,如果它很长是一个昂贵的操作,可能 运行 机器内存不足。