c++ - 调用带有字符串参数的函数直接与变量

标签 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() at ...\esp8266\2.3.0\cores\esp8266/WString.cpp line 720

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

free at ...\esp8266\2.3.0\cores\esp8266\umm_malloc/umm_malloc.c line 1733

String::~String() at ...\esp8266\2.3.0\cores\esp8266/WString.cpp line 720

这样调用函数有什么区别?为什么第一种方法效果好而第二种方法效果不好?

最佳答案

如果你通过引用调用一个字符串

  void foo(std::string const &str)

不复制底层字符。如果按值调用

  void food(std::string str)

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

关于c++ - 调用带有字符串参数的函数直接与变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41899464/

相关文章:

c - 如何在 Arduino 中串行可用时退出 'for' 循环

c++ - 如何检查分割的平面是否是真实平面

C++ 未使用我自己的字符串复制函数按预期打印

c++ - g++ 在基类中找不到重载函数

iOS - [stringObject 类] 从电话联系人返回 "(null)"?这怎么可能?

python - 为什么 f-strings 不能很好地与字典一起使用?

java - 判断字符串中是否有两个特定字符

c - 为了硬件灵活性,#ifdef 语句应该走多远

arduino - Arduino 如何检测 LED 的状态?

c++ - C++14 中的有符号位域