C++ casted realloc 导致内存泄漏

标签 c++ casting realloc

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

相关文章:

c++ - 在 openCV 中为 oclMat 添加小图像到大图像

c++ - 无法将参数从 'SIZE_T *' 转换为 'size_t *' - 如何转换?

c++ - 如何在不使用 realloc 的情况下使用 new 和 delete C++ 时释放动态数组?

c - 重新分配内存后指针指向错误的方向

c - 如何在C中读取无限字符

c++ - 在 C++ 中重载运算符时 "const"是什么意思

c++ - 使用 boost/property_tree 从具有多个元素/数组/子数组 C++ 的 json 文件中获取值

c++ - 同一对象(由内存地址推导)构造两次而没有破坏

c# - json.NET 反序列化 2D 数组时抛出 InvalidCastException

gcc - 如何在 C 中类型转换文字