我正在使用我发现的函数 here使用 cURL 将网页保存到内存:
struct WebpageData {
char *pageData;
size_t size;
};
size_t storePage(void *input, size_t size, size_t nmemb, void *output) {
size_t realsize = size * nmemb;
struct WebpageData *page = (struct WebpageData *)output;
page->pageData = (char *)realloc(page->pageData, page->size + realsize + 1);
if(page->pageData) {
memcpy(&(page->pageData[page->size]), input, realsize);
page->size += realsize;
page->pageData[page->size] = 0;
}
return realsize;
}
并找到这一行:
page->pageData = (char *)realloc(page->pageData, page->size + realsize + 1);
导致每次调用发生几百字节的内存泄漏。我对原始来源所做的唯一真正的改变是将有问题的行转换为 (char *),我的编译器(gcc,g++ 特别是如果它是 c/c++ 问题,但 gcc 也不会用 uncast 编译声明)坚持,但我认为这是泄漏的来源。谁能解释一下?
谢谢
最佳答案
您发布的代码(据我所知)是正确的。如果漏水,我
怀疑您在某个时候忘记了 free()
内存块。
realloc
允许创建一个全新的内存块,如果它不能简单地
扩展现有的,这是您感兴趣的。当然也允许分配比需要更大的 block ,这可能会导致幻象泄漏。
现在,既然你在使用 C++,我不得不问:你为什么不使用
std::vector
代替?
struct WebpageData {
std::vector<char> pageData;
size_t size;
};
size_t storePage(void *input, size_t size, size_t nmemb, void *output) {
size_t realsize = size * nmemb;
WebpageData *page = reinterpret_cast<WebpageData *>(output);
page->pageData.resize(page->size + realsize + 1);
memcpy(&(page->pageData[page->size]), input, realsize);
page->size += realsize;
page->pageData[page->size] = 0;
return realsize;
}
关于C++ casted realloc 导致内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2824510/