Предотвращает ли 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.

, 👍0

Обсуждение

Кстати: какая библиотека HTTPClient? Я знаю один, который позволяет использовать объекты HttpClient, а не HTTPClient., @DataFiddler


2 ответа


Лучший ответ:

3

Возвращаемое значение 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


0

http.getString() создает временный объект String Arduino и заполняет текстом динамическую память в куче. Вызов метода .toCharArray копирует этот текст в массив символов, где бы вы его ни определили. Сразу после этого временная String выходит из области видимости, а текст в куче снова удаляется.

,