【问题标题】:I trigger a breaking point while trying to free() struct array我在尝试释放()结构数组时触发了一个断点
【发布时间】:2021-11-28 07:08:18
【问题描述】:

我在重新分配内存时遇到了这个问题。我创建了一个程序,您可以在其中放置有关不同杂货的信息。一个小规模的购物清单。我正在尝试为列表中的每个新项目扩展和缩小项目列表。对于第一项,它在分配和释放旧的 NULL 内存时没有任何问题。但是当添加更多项目并同时尝试释放分配的内存时,程序会在第 144 行触发断点。这是我得到的消息。 “wntdll.pdb 包含查找模块 ntdll.dll 源所需的调试信息”我做错了什么?

这是我为此目的而创建的函数。

void addSpace(struct GroceryItem** pitemList, int listLength)
{
    int add = listLength + 1;
    struct GroceryItem * temp;
    temp = NULL;
    do {
        temp = (struct GroceryItem*)realloc(*pitemList, add * sizeof(struct GroceryItem));
      
    } while (temp == NULL);
    if(listLength!=0)
        free(*pitemList);
    _CrtDumpMemoryLeaks();//Cheking for memory leaks
    *pitemList = temp;
    return;
}

我对编程很陌生,所以如果在理解我的问题时遇到任何问题,请报告,我会尝试更具体。

【问题讨论】:

    标签: c free realloc


    【解决方案1】:
    • do{}while(temp == NULL) 很可疑。基本上这意味着“如果计算机内存不足,则挂起程序”。

    • if(listLength!=0) free(*pitemList); 完全错误,只需删除此代码即可。 realloc 是负责在需要时释放旧内存的函数。它还可能返回一个与您传递的地址相同的地址。

    基本上你可以重写这个函数并简单地:

    void addSpace(struct GroceryItem** pitemList, int listLength)
    {
        int add = listLength + 1;
        struct GroceryItem * temp;
        temp = realloc(*pitemList, add * sizeof(*tmp));
        if(temp == NULL)
        { 
          /* handle error - exit program etc */ 
        }
        *pitemList = temp;
    }
    

    这又只是 realloc 的一个瘦函数包装器,因此该函数是否满足一开始的目的是有争议的。

    【讨论】:

      【解决方案2】:

      你的主要问题是free的使用:

      • realloc 扩展内存区域的情况:这里temppitemList 将包含相同的地址,因此释放pitemList 本质上释放temp。之后,temp 指向无效内存。解决方法:去掉对free的调用。
      • realloc 重新定位内存区域的情况:这里temp 将指向新的内存区域,pitemList 将被realloc 释放。因此,在您的代码中释放pitemList 会导致双重释放。解决方法:去掉对free的调用。

      所以在这两种情况下,解决方案都是不要免费调用。更多关于realloc的信息可以在这里找到:https://en.cppreference.com/w/c/memory/realloc

      此外,在 while 循环中运行 realloc 可能不会带来任何好处。如果realloc 失败一次,您可能只想中止您的程序。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-04
        • 1970-01-01
        • 2018-10-16
        • 2020-09-23
        • 2017-04-11
        • 1970-01-01
        • 2014-10-26
        相关资源
        最近更新 更多