我有一个似乎无法解决的情况。它导致缓慢但随着时间的推移灾难性的内存泄漏。我注意到,即使我释放了一个指针结构(我将其传递给了一个函数),我也忘记了释放它们内部的指针,根据 valgrind 的说法,这会导致内存泄漏。我试图从函数中释放指针的内存,但似乎无法解决错误消息error: request for member 'xxx' in something not a structure or union
。
这是我的程序的简短概述。我正在创建一个数据结构,其中包含线程函数所需的变量。有一个主函数,参数被传递给它,并根据数据填充适当的结构。然后它启动实际函数的线程(将结构作为 void 指针传递),我在其中获取并重新创建函数内部的实际结构。这是代码:
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: %s\n", *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:%s\n exec:%s\n", 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("%s\n", buff);
sleep(1);
}
pclose(command);
// cleans itself up from the tracking structures
thread_remove(EXEC, 0);
// exits cleanly
return NULL;
}
为了解决该错误,我尝试将结构投射到它前面,但错误仍然存在。使用->
运算符会导致void* deference
错误。
我还从功能中删除了一些大块内容,例如检查线程是否已经在运行和错误检查以减少混乱。这两个函数都可以在我的应用程序中工作(它创建的线程可以很好地存储它,并且它正在完美地传递和创建新结构,并且它正在执行传递的命令)。只是我不知道如何释放我从线程内部进行的两个 malloc 调用。我该如何解决这个问题?