Предотвращает ли toCharArray создание строки в куче?
Я знаю, что использовать строки плохо из-за возможных проблем с памятью. Я попытался удалить все экземпляры строк из своего кода. Но я не уверен в этой строке:
http.getString().toCharArray(ipAddressBuffer, lengthOfIPAddress);
Достаточно ли вызова toCharArray()
для предотвращения проблем с памятью? Или в куче все еще создается строка?
Если он все еще создается в куче, как мне изменить код, чтобы он работал только с cstrings?
Вот мой код:
void setIPAddress(char* ipAddressBuffer){
HTTPClient http;
http.begin("http://bot.whatismyipaddress.com/"); // Разрешается звонить только один раз в 5 минут.
http.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36");
int httpCode = http.GET();
if (httpCode > 0) {
http.getString().toCharArray(ipAddressBuffer, lengthOfIPAddress);
}
else {
Serial.println("Error on HTTP request");
}
http.end();
}
Кстати, я использую библиотеку HTTPClient.h.
@David Klempfner, 👍0
Обсуждение2 ответа
Лучший ответ:
Возвращаемое значение getString выделяет и удаляет массив символов в куче для временного объекта String.
Для ESP8266HTTPClient и библиотеки ESP32 HTTPClient вы можете использовать writeToStream
или getStream()
, чтобы прочитать ответ без использования класса String с getString()
, где stream
— это WiFiClient& поток = client.getStream();
getStream
возвращает базовый WiFiClient. Вы можете прочитать данные с помощью классического while (stream.available()) { char c = stream.read; ... }
writeToStream
копирует данные в поток. В моей библиотеке StreamLib есть обертка потока над массивом символов. Он называется CStringBuilder.
Одно предостережение к вашему ответу: я читал в документации ArduinoJson, что [если вы выполняете client.getStream()
, вы обходите код кодирования фрагментированной передачи](https://arduinojson.org/v6/how-to/use-arduinojson -with-httpclient/#:~:text=К сожалению,%2C%20by%20используя%20%20базовый%20Stream%2C%20we%20bypass%20the%20code%20that%20handles%20chunked%20transfer%20encoding%2C%20so%20we %20must%20switch%20to%20HTTP%20version%C2%A01.0.) и что в этом случае вы должны вернуться к HTTP1.0, используя useHTTP10(true)
. Вы сталкивались с этим, и вы могли бы включить это в свой ответ?, @hansmbakker
Или [writeToStream(Stream * stream)
](https://github.com/espressif/arduino-esp32/blob/23d715af1b185fac21558c907af4ff5b86526aa4/libraries/HTTPClient/src/HTTPClient.cpp#L883), который [getString()
используется внутри](https://github.com/espressif/arduino-esp32/blob/23d715af1b185fac21558c907af4ff5b86526aa4/libraries/HTTPClient/src/HTTPClient.cpp#L975) хорошая идея?, @hansmbakker
@hansmbakker в моей StreamLib есть ChunkedStreamReader. см. пример ReadChunkedJson. StreamLib находится в менеджере библиотек, @Juraj
http.getString()
создает временный объект String Arduino и заполняет текстом динамическую память в куче. Вызов метода .toCharArray
копирует этот текст в массив символов, где бы вы его ни определили.
Сразу после этого временная String выходит из области видимости, а текст в куче снова удаляется.
- Использование c_str() для String для IPAddress с NTPClient дает неправильные значения
- форматирование строк в Arduino для вывода
- Проблемы с преобразованием byte[] в String
- Как преобразовать форматированный оператор print в строковую переменную?
- Преобразование строки в IP-адрес
- Чтение строки, разделенной запятыми
- Выделение строковой памяти Arduino
- Как очистить кучу памяти в esp32
Кстати: какая библиотека HTTPClient? Я знаю один, который позволяет использовать объекты HttpClient, а не HTTPClient., @DataFiddler