gcc 4.6.1
В инклудах это:
#include <cstdlib>
#include <iostream>
#include <queue>
#include <string>
#include <pthread.h>
#include <curl/curl.h>
#include <curl/easy.h>
#include "document_struct.h"
#include "html_getting_thread.h"
Как видно, string - на месте, объявление strcpy в заголовочном файле есть, по клику на функцию IDE (NetBeans 7.1) успешно находит ее. При попытке компиляции gcc вываливается с сабжем. Я очень уверен, что где - то неправ именно я, а не компилятор, но разобраться за 4 часа копания в гугле не получилось.
По сути мне нужно const char* скопировать в char*, может есть аналоги? Руками писать - не комельфо как то, знаю что можно через memcpy с проверкой на /0, но блин, костыль же?
P.S.: Эту проблему ув. форумчане помогли решить и она более не актуальна. Нужно подключать cstring:
#include <cstring>
Код:
//Вечный цикл работы потока
for (;;) {
//Если пришло время прощаться, значит такова жизнь
if (itsTimeToSayGoodbye)
break;
//Блокировка мьютекса для очереди url
pthread_mutex_lock(¶ms->urlsMutex);
//Если очеред не пуста, выдираем из нее один url
//и качаем с него контент
if (!urls->empty()) {
//Буффер для принятия данных от curl
string* dataBuffer = new string();
string* url = new string(urls->front());
urls->pop();
//Незачем более держать доступ к очереди, зарблокируем мьютекс
pthread_mutex_unlock(¶ms->urlsMutex);
char* urlBuff = new char(url->length() + 1);
strcpy(urlBuff, url->c_str());
//Вылетает с SIGABRT на этом месте <-------
curl_easy_setopt(curl, CURLOPT_URL, urlBuff);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, dataBuffer);
CURLcode responseCode;
responseCode = curl_easy_perform(curl);
cout << dataBuffer->c_str();
if(responseCode != CURLE_OK) {
string* curlErrorMessage = new string(curl_easy_strerror(responseCode));
cout << "==== ATTENTION! ====" << endl;
cout << "Curl error: " << curlErrorMessage->c_str() << endl << "URL: " << url->c_str()
<< endl << "Thread #" << (params->lastThreadIndex - 1) << endl;
cout << "====================" << endl;
delete curlErrorMessage;
}
//Почистим за собой память, dataBuffer оставим, т.к. в нем
//у нас данные документа, которые будут переданы парсеру
curl_easy_setopt(curl, CURLOPT_URL, NULL);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, NULL);
delete urlBuff;
delete url;
} else {
//Очередь оказалась пуста, а мы уже заблокировали мьютекс,
//отпустим его.
pthread_mutex_unlock(¶ms->urlsMutex);
}
//Пускай процессор подышит, наша задача не самая приоритетная
sleep(100);
}