C-将指针释放指针



我的情况似乎无法解决。它导致缓慢,但随着时间的流逝,灾难性的内存泄漏。我注意到,即使我释放了指针的结构(我传递给功能),但我忘了释放他们内部的指针,根据Valgrind,这会导致内存泄漏。我试图从功能内部释放指针的内存,但是我似乎无法解决错误消息error: request for member 'xxx' in something not a structure or union

这是我程序的简短概述。我正在创建一个数据结构,该数据结构容纳了螺纹函数所需的变量。有一个主要函数将参数传递给,并取决于其填充在适当结构中的数据。然后,它启动了实际函数的线程(将结构作为空隙指针传递),在该函数中,我在该函数内部进行并重新创建了该函数内部的实际结构。这是代码:

void cmd_test(char *sender, char **args, int arg_count) {
    char command[1024];
    // creates my exec pointer structure
    exec_struct *exec = malloc(sizeof(exec_struct));
    // adds a thread identifier to a struct to keep track of threads
    exec->tID = thread_add(EXEC);
    // the first malloc which I don't know how to free
    exec->sender = malloc(sizeof(char) * strlen(sender) + 1);
    sprintf(exec->sender, "%s", sender);
    // move ahead 5 arguments (there will always be 5 or more arguments supplied
    // by the calling function)
    args += 5;
    memset(command, 0, sizeof(command));
    // concatenate the remaining arguments into a cstring
    while(*args[0]) {
        printf("arg: %sn", *args);
        sprintf(command, "%s %s", command, *args);
        args++;
    }
    // the second malloc which I don't know how to free
    exec->exec = malloc(sizeof(char) * strlen(command) + 1);
    // copy the string to the structure from pointer+1 to end of pointer
    // removes a space created from the first iteration of previous loop)
    sprintf(exec->exec, "%s", command + 1);
    printf("command:%sn exec:%sn", command, exec->exec);
    //stores an actual thread id into a struct of threads to keep track of 
    //the actual thread (other one is just to keep track of what type
    //of thread is running)
    threads[exec->tID].tID = Thread_Start(exec_cmd, exec);
}

这就是我对正在发生的事情进行一些评论来设置结构的方式。Thread_Start()只是一个函数,它接受一个函数地址和结构地址,以传递到螺纹函数。这是exec_cmd函数:

void *exec_cmd(void *param) {
    char buf[1024];
    FILE *command;
    // recreate the structure locally inside the thread
    exec_struct exec = *((exec_struct *)param);
    // causes the error described
    // free(param.exec);
    // free(param.sender);
    // free the structure memory from the thread creating function.
    free(param);
    memset(buf,0,1024);
    sprintf(buf,"%s",exec.exec);
    command = popen(buf,"r");
    while(!feof(command)) {
        memset(buf,0,1024);
        fgets(buf,1024,command);
        printf("%sn", buff);
        sleep(1);
    }
    pclose(command);
    // cleans itself up from the tracking structures
    thread_remove(EXEC, 0);
    // exits cleanly
    return NULL;
}

为了解决错误,我试图将结构施放在其前面,但错误仍然存在。使用->操作员导致void* deference错误。

我还从功能中删除了一些批量,例如检查线程是否已经在运行,并且检查杂物减少的错误检查。这些函数都可以在我的应用程序中起作用(它创建线程将其存储正常,并且可以通过并完美地创建新结构,并且正在执行传递的命令)。只是我无法弄清楚如何释放我从线程内部的两个malloc呼叫。我该如何解决此问题?

exec_struct exec = *((exec_struct *)param);
//free(param.exec);
//free(param.sender);

参数是传递的void *。您的结构副本称为exec

您的意思是:

free(exec.exec);
free(exec.sender);

请注意,您稍后在同一功能中及时访问exec.exec。如果您已经释放了它,就无法做到这一点。复制结构并不意味着您已经复制了指针指向的内存。

这一行:

sprintf(buf,"%s",exec.exec);

需要在 exec.exec免费之前发生。

一般原则是您从结构中的"最深"级别开始,然后努力工作。在释放内部的所有内容之前,永远不要让"上层"层的某些东西释放。换句话说,请使用相反的顺序。

我真的看不到这样做的意义:

exec_struct exec = *((exec_struct *)param);

我只会复制原始指针:

exec_struct *exec = (exec_struct *)param;

然后

free(exec->sender); 
free(exec->command);
free(exec);

当然,在使用Exec结构完成之前,您不应进行任何释放。

相关内容

  • 没有找到相关文章

最新更新