cURL을 사용하여 C++로 웹 사이트에서 데이터를 가져 오기 위해 클래스를 작성하려고합니다. 다음은 그 클래스의 샘플입니다 (curl * curl_ 데이터 멤버가 있습니다. rawData_는 문자열입니다). 이 발췌 부분은 구현 파일에서 가져온 것입니다. 모든 함수는 헤더에 선언되어 있습니다.libcurl/cURL C++ segfault
MyClass::MyClass()
{
curl_global_init(CURL_GLOBAL_ALL);
curl_ = curl_easy_init();
curl_easy_setopt(curl_, CURLOPT_URL,
"http://www.google.com");
curl_easy_setopt(curl_, CURLOPT_WRITEFUNCTION, &MyClass::writeCallback);
}
MyClass::~MyClass()
{
curl_easy_cleanup(curl_);
curl_global_cleanup();
}
size_t MyClass::writeCallback(char* buf, size_t size, size_t nmemb, void* up)
{
//buf is a pointer to the data that curl has for us
//size*nmemb is the size of the buffer
for (size_t c = 0; c<size*nmemb; ++c)
{
cerr << c << endl;
rawData_.push_back(buf[c]);
}
return size*nmemb; //tell curl how many bytes we handled
}
void MyClass::makeCall()
{
curl_easy_perform(curl_);
}
MyClass의 인스턴스를 만들고 makeCall을 호출하면 writeCallBack 함수에 segfault가 있습니다. 즉, buf는 크기가 0 인 것처럼 보입니다 (c = 0 일 때 buf [c] 호출이 중단됩니다). 어떤 도움을 주신다면
'buf == this' 여부를 테스트 했습니까? –
내가 걱정해야 할 것이 있나요? 내가 아는 한 'buf'는 웹 호출에 의해 전달 된 것입니다. 기본적으로 웹 사이트의 데이터 여야합니다. – GuestUser11111
C++ 클래스 메서드에서 'this'는 정적 C 스타일 함수의 암시 적 첫 번째 인수로 생각할 수 있습니다. curl이 제공된 콜백을 C 스타일 함수 (마치) 인 것처럼 호출하면 적어도 호출 규칙은 호출 될 때 클래스 메소드에서 C++이 기대하기 때문에 호출 규칙이 아닙니다. –