При использовании функции curl не известно какой длины будет читаемая страница. Поэтому используют режим
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION,ФУНКЦИЯ ...
curl читает страницу блоками постоянной длины и передает прочитанный буфер указанной ФУНКЦИИ.
Она же обязана добавить блок к результату.
В C++ многие используют лямда функцию вместо ссылки на реальную функцию. При выполнения готового примера
я столкнулся с аварийным завершением программы: exit value 1073 741 819. В Windows
это означает защита доступа к памяти!
После длительных поисков я нашел такой текст:
--------------------------------------------------------------------------------------
Curl_easy_setopt документирован
сигнатурой
CURLcode curl_easy_setopt(CURL *handle, CURLoption option, parameter);
где параметр может быть одним из
нескольких типов в зависимости от опции.
Очевидно, что (как C API, где C не имеет
перегрузки) он должен делать что-то
странное, и это подтверждается
рассмотрением the
source, где мы видим, что Curl_easy_setopt
реализован с помощью varargs.
CURL_EXTERN CURLcode curl_easy_setopt(CURL *curl, CURLoption option, ...);
Таким образом, проблема с передачей
лямбды в Curl_easy_setopt заключается в том,
что она передается как есть, поскольку
Curl_easy_setopt говорит, что может принимать
объекты любого типа. Фактический объект,
представленный лямбда-выражением,
представляет собой всего лишь структуру
захватов; в этом случае вы просто
передаете пустой объект структуры в
функцию Curl_easy_setopt, когда она ожидает
указатель на функцию. Наступает хаос.
Лямбда-выражения без захватов можно
явно преобразовать в указатели на
функции с помощью унарного +.
// v one char fix!
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, +[](void *buffer, size_t size, size_t count, std::string *stream) -> size_t {
auto s_size = size * count;
stream->append((char *)buffer, 0, s_size);
return s_size;
});
Это преобразование также может происходить
неявно, но curl_easy_setopt не предоставляет
никакой информации о типе и, следовательно,
не запускает преобразование автоматически.
***********************************************************************
Как только я поставил этот плюсик ВСЕ заработало!