C++ libcurl curl_easy_perform crash(分段错误)c++;

C++ libcurl curl_easy_perform crash(分段错误)c++;,c++,curl,crash,libcurl,C++,Curl,Crash,Libcurl,我很抱歉我的英语不好。 我正在尝试运行以下代码,但是当进度运行大约一天或几个小时时,它会崩溃,所以这次崩溃是偶然发生的。 顺便说一下,SecMonitor\u Curl是一个单独的类,因此Curl\u global\u init()只运行一次全局。 我不能解决这个问题,所以我不知道我的程序出了什么问题。请帮帮我。谢谢 SecMonitor_Curl::SecMonitor_Curl() { curl_global_init(CURL_GLOBAL_ALL); } SecMonit

我很抱歉我的英语不好。 我正在尝试运行以下代码,但是当进度运行大约一天或几个小时时,它会崩溃,所以这次崩溃是偶然发生的。 顺便说一下,SecMonitor\u Curl是一个单独的类,因此Curl\u global\u init()只运行一次全局。 我不能解决这个问题,所以我不知道我的程序出了什么问题。请帮帮我。谢谢

   SecMonitor_Curl::SecMonitor_Curl()
{
    curl_global_init(CURL_GLOBAL_ALL);
}

SecMonitor_Curl::~SecMonitor_Curl()
{
    curl_global_cleanup();
}


static size_t write_to_string(void *ptr, size_t size, size_t nmemb, void *stream) {
    ((std::string*)stream)->append((char*)ptr, 0, size*nmemb);
    return size * nmemb;
}


int SecMonitor_Curl::http_get(const std::string url, const std::string method, const std::map<std::string, std::string>& params, std::string post_data, std::string& response)
{
    int ret = 0;
    CURLcode res;
    curl_ = curl_easy_init();
    if (curl_ == NULL)
    {
        return -1;
    }
    if(curl_)
    {
        url_t = "www.google.com";
        method = "POST";
        post_body="{"test":"test"}";

        res = curl_easy_setopt(curl_, CURLOPT_URL, url_t.c_str());

        if (method == "POST" || method == "PUT" || method == "DELETE")
        {
            curl_easy_setopt(curl_, CURLOPT_CUSTOMREQUEST, method.c_str());
            curl_easy_setopt(curl_, CURLOPT_POSTFIELDS, post_body.c_str());
            curl_easy_setopt(curl_, CURLOPT_POSTFIELDSIZE, post_body.size());
        }

        res = curl_easy_setopt(curl_, CURLOPT_FOLLOWLOCATION, 1L);
        res = curl_easy_setopt(curl_, CURLOPT_NOSIGNAL, 1L); 
        res = curl_easy_setopt(curl_, CURLOPT_ACCEPT_ENCODING, "deflate");
        std::string out;
        res = curl_easy_setopt(curl_, CURLOPT_WRITEFUNCTION, write_to_string);
        res = curl_easy_setopt(curl_, CURLOPT_WRITEDATA, &out);

        //printf("curl_version : %s ",curl_version());
        res = curl_easy_perform(curl_);
        /* Check for errors */
        if (res != CURLE_OK) {
            srlog_error("SecMonitor_Curl | curl_easy_perform() failed: %s\n",
                    curl_easy_strerror(res));
            ret = -1;
        }
        response = out;
    }
    else
    {
        ret = -1;
    }
    curl_easy_cleanup(curl_);

    return ret;
}
SecMonitor\u Curl.cpp:131:表示Curl\u easy\u perform()


谢谢

我收集了3个write\u to\u字符串回调函数: 第一:

第二:

static size_t write_to_string(void *contents, size_t size, size_t nmemb, std::string *s)
{
    size_t newLength = size*nmemb;
    size_t oldLength = s->size();
    try
    {
        s->resize(oldLength + newLength);
    }
    catch(std::bad_alloc &e)
    {
        //handle memory problem
        return 0;
    }

    std::copy((char*)contents,(char*)contents+newLength,s->begin()+oldLength);
    return size*nmemb;
}
第三:

   struct MemoryStruct {
      char *memory;
      size_t size;
    };

    static size_t
    write_to_string(void *contents, size_t size, size_t nmemb, void *userp)
    {
      size_t realsize = size * nmemb;
      struct MemoryStruct *mem = (struct MemoryStruct *)userp;

      mem->memory = realloc(mem->memory, mem->size + realsize + 1);
      if(mem->memory == NULL) {
        /* out of memory! */
        printf("not enough memory (realloc returned NULL)\n");
        return 0;
      }

      memcpy(&(mem->memory[mem->size]), contents, realsize);
      mem->size += realsize;
      mem->memory[mem->size] = 0;

      return realsize;
    }

这些回调方法可以处理将curl响应输出到字符串的事情。但是这个问题不在这里,所有的崩溃都是因为“crul_”是这个类的成员变量。当“http_get”函数通过多线程引用时,必须发生崩溃。

write_to_string
a
static
成员函数吗?如果不是,则不能将其用作回调。非静态成员函数与非成员(或
static
member)函数不同,因为它需要调用对象。是的,write_to_字符串是一个静态函数。除非我在C++14添加过程中睡着了,否则您使用的
append
成员是错误的。您应该使用
append((const char*)ptr,size*nmemb)。注意:第二个参数为0。您正在使用的版本实际上是隐式地试图从
ptr
中构造一个temp
std::string
,以通过常量引用作为第一个参数传递,并且没有终止,最终是错误的。感谢@WhozCraig,我修改了“append”错误,但崩溃没有得到解决。我将回调更改为这样`size\u t write\u to_string(void contents,size\u t size,size\u t nmemb,std::string*s){size\u t newLength=sizenmeb;size\u t oldLength=s->size();try{s->resize(oldLength+newLength)}catch(std::bad\u alloc&e){//handle memory problem return 0;}std::copy((char*)contents,(char*)contents+newLength,s->begin()+oldLength);return size*nmemb;}`但我没有解决此崩溃问题。
static size_t write_to_string(void *contents, size_t size, size_t nmemb, std::string *s)
{
    size_t newLength = size*nmemb;
    size_t oldLength = s->size();
    try
    {
        s->resize(oldLength + newLength);
    }
    catch(std::bad_alloc &e)
    {
        //handle memory problem
        return 0;
    }

    std::copy((char*)contents,(char*)contents+newLength,s->begin()+oldLength);
    return size*nmemb;
}
   struct MemoryStruct {
      char *memory;
      size_t size;
    };

    static size_t
    write_to_string(void *contents, size_t size, size_t nmemb, void *userp)
    {
      size_t realsize = size * nmemb;
      struct MemoryStruct *mem = (struct MemoryStruct *)userp;

      mem->memory = realloc(mem->memory, mem->size + realsize + 1);
      if(mem->memory == NULL) {
        /* out of memory! */
        printf("not enough memory (realloc returned NULL)\n");
        return 0;
      }

      memcpy(&(mem->memory[mem->size]), contents, realsize);
      mem->size += realsize;
      mem->memory[mem->size] = 0;

      return realsize;
    }