2017-01-27 99 views
0

我遇到了一個問題我並不真正瞭解如何使用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 ........."); 

運行在發生碰撞的第二特徵的結果。下面是疊層的一部分:在... \ esp8266 \ 2.3.0 \芯\ esp8266 \ umm_malloc/umm_malloc.c線1163

字符串::〜字符串()在

umm_assimilate_up。 .. \ esp8266 \ 2.3.0 \核心\ esp8266/WString.cpp線720

_umm_free在... \ esp8266 \ 2.3.0 \核心\ esp8266 \ umm_malloc/umm_malloc.c線1287

免費at ... \ esp8266 \ 2.3.0 \ cores \ esp8266 \ umm_malloc/umm_malloc.c line 1733

字符串::〜字符串()在... \ esp8266 \ 2.3.0 \ cores \ esp8266/WString.cpp行720

這裏調用函數的區別在哪裏?爲什麼第一種方法運作良好,第二種方法不行?

+2

https://hackingmajenkoblog.wordpress.com/2016/02/04/the-evils-of-arduino-strings/ –

回答

3

如果通過參考

void foo(std::string const &str) 

底層人物的任何副本是由調用的字符串。如果通過調用值

void food(std::string str) 

海峽被複制,這如果是很長的,可以運行的機器耗盡內存昂貴的操作。