CURLOPT_WRITEFUNCTION回调内无法复制数据问题求助
嘿,我一眼就看到你代码里的几个关键问题,这就是导致memcpy失效、内存损坏的根源——咱们一步步拆解:
1. memcpy的参数完全搞反了
你现在写的是memcpy(&mem_ptr, &ptr, realsize);,这大错特错!
mem_ptr是你malloc出来的内存块的指针,&mem_ptr是取这个指针变量本身的地址(也就是栈上的一个小内存区域,只有指针大小,比如8字节)&ptr是传入的void* ptr参数的地址,同样是栈上的指针地址
你这相当于把ptr指针所在的栈内存的内容,拷贝到mem_ptr指针变量的栈内存里,完全没碰你malloc的堆内存!正确的写法应该是直接用指针指向的内存:
memcpy(mem_ptr, ptr, realsize);
这样才是把ptr指向的数据,拷贝到你分配的mem_ptr堆内存里。
2. 数组越界写入,直接踩内存
你分配的是nmemb*size+1字节的内存,也就是索引范围是0到realsize(因为realsize = nmemb*size)。但你写了mem_ptr[realsize+1] = 0;,这直接越界了!越界写入会破坏相邻的内存块,导致内存损坏。正确的终止符应该写在realsize的位置:
mem_ptr[realsize] = 0;
3. 静态变长数组的坑(如果用注释里的代码)
注释里的char mem_ptr[realsize+1];是C99的变长数组(VLA)特性,标准C++并不支持,不同编译器的行为可能不一致,甚至直接编译失败。如果不想用malloc,建议用std::vector<char>来替代,安全又省心:
std::vector<char> mem_ptr(realsize + 1); memcpy(mem_ptr.data(), ptr, realsize); mem_ptr[realsize] = 0;
4. 内存泄漏问题
你用malloc分配了内存,但没有调用free(mem_ptr);,这会导致内存泄漏,长期运行会耗尽内存。如果用std::vector就不用手动管理内存了,它会自动释放。
修正后的完整代码(推荐用vector版本)
size_t func(void* ptr, size_t size, size_t nmemb, void *stream) { size_t realsize = nmemb * size; WebRequest* webRequest = static_cast<WebRequest*>(stream); // 用vector更安全,避免手动管理内存 std::vector<char> mem_ptr(realsize + 1); memcpy(mem_ptr.data(), ptr, realsize); mem_ptr[realsize] = 0; // 正确的终止位置 std::string s(mem_ptr.data()); std::cout << s << std::endl; webRequest->addBody(s); return realsize; }
如果你坚持用malloc的版本
size_t func(void* ptr, size_t size, size_t nmemb, void *stream) { size_t realsize = nmemb * size; WebRequest* webRequest = static_cast<WebRequest*>(stream); char* mem_ptr = static_cast<char*>(malloc(realsize + 1)); if (!mem_ptr) { // 一定要检查malloc是否成功! // 处理内存分配失败的情况,比如返回0或者抛出异常 return 0; } memcpy(mem_ptr, ptr, realsize); mem_ptr[realsize] = 0; std::string s(mem_ptr); std::cout << mem_ptr << std::endl; webRequest->addBody(s); free(mem_ptr); // 释放内存,避免泄漏 return realsize; }
另外补充:记得检查malloc的返回值,如果分配失败会返回NULL,不处理的话会导致后续操作崩溃。用static_cast替代C风格的强制转换,在C++里更规范。
内容的提问来源于stack exchange,提问作者Art Em
相关产品推荐
相关产品推荐

