gpt4 book ai didi

C++ casted realloc 导致内存泄漏

转载 作者:太空宇宙 更新时间:2023-11-04 12:25:23 24 4
gpt4 key购买 nike

我正在使用我发现的函数 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com