如何在C中释放双指针结构?

时间:2016-01-05 19:10:14

标签: c pointers

我有一个像这样定义的结构:

Parse.Cloud.job("doSth", function(request, status) { // begin Cloud.Job("doSth")
  var userQuery = new Parse.Query(Parse.User);
  var users = []
  var promises = []
  promises.push( // Start Promise [0]
userQuery.each(function(user){ // userQuery.each [0]

  var currentUser = user;
  users.push("LOOP1-"+user.get("firstname"))
  console.log("LOOP1-User: "+user.get("firstname"))

  //promises2.push( // End Promise [1]
    return userQuery.each(function(user){ // userQuery.each [1]
      if (user == currentUser){
        console.log("$$$$$$$ SAME USER $$$$$$$")
      } else {
        if (currentUser.get("memberIDs").indexOf(user.get("memberId")) > -1 ){
          console.log("Found (different) member!")

        }
      }
      users.push("LOOP2-"+user.get("firstname"))
      console.log("LOOP2-User: "+user.get("firstname"))
    }) // End userQuery.each [0]
  //) // End Promise [1]
}) // End userQuery.each [0]
  ) // End Promise [0]
  Parse.Promise.when(promises).then(function(){
console.log(users)
status.success("Success")
  }, function(error){
status.error(error)
  })

}) // end Cloud.Job("doSth")

和main函数中的结构指针(不是全局指针):

typedef struct {
char userType;                          // - The type of the user.
char userName[userName_len];            // - The user's user name.
char password[password_len];            // - The user's password.
char id[id_len];                        // - The user's id.
char firstName[userName_len];           // - The users first name.
char lastName[userName_len];            // - The user's surname.
char address[address_len];              // - The user's address.
}Users;

我从文本文件中填充该数据库并将指针发送到它,如下所示:

Users* users_db = NULL;

Fill_Databases将指针传递给其他函数,如下所示:

Fill_Databases(&users_db,&qnty); //qnty is a pointer to Quantity struct used for help.

在该函数中,使用calloc进行内存分配。

现在我需要释放结构,我遇到了运行时问题“触发了一个断点。”

我将它发送到Free_Databases函数的方式与我为em分配内存并尝试释放em的方式相同:

Fill_Users_db(users_db, &*qnty);

那有什么不对?什么是正确的方式来释放他们?

编辑: 分配补充:

 void Free_Users_db(Users** users_db, Quantity qnty)
{
    int i;
    for (i = 0; i < qnty.Users; i++)
    {
        free(users_db[i]);
        users_db[i] = NULL;
    }
    free(users_db);
    users_db = NULL;
    puts("users db free");
}

2 个答案:

答案 0 :(得分:2)

use lib ...;在main函数中定义为users_db结构数组,而不是指针数组。因此,Users个别数组元素是错误的。此外,您需要取消引用users_db指针,因为您将其作为双指针传递。请尝试以下方法。

free()

答案 1 :(得分:1)

void Free_Users_db(Users** users_db, Quantity qnty)
{
    int i;
    for (i = 0; i < qnty.Users; i++)
    {
        free(users_db[i]);
        users_db[i] = NULL;
    }
    free(users_db);
    users_db = NULL;
    puts("users db free");
}

应该是

  void Free_Users_db(Users** users_db, Quantity qnty)
    {
        int i;
       /* for (i = 0; i < qnty.Users; i++)
        {
            free(users_db[i]);
            users_db[i] = NULL;
        }*/
        free(*users_db);
        *users_db = NULL;
        puts("users db free");
    }

正如您在Fill_Users_db函数中看到的那样,只有一次调用calloc。为什么将一个调用映射到分配函数到多个free调用?这是不正确的。对malloccalloc等分配函数的每次调用都应映射到free的一次调用。