我正在创建这样的变量:
pthread_t *thread;
struct thread_data *data;
//allocate space for threads and their data
thread = malloc(num_threads*sizeof(*thread));
data = malloc(num_threads*sizeof(*data));
在我完成它们之后,我试图释放内存如下:
//uuu... there is no garbage collector :P
for (unsigned long i=0;i<num_threads;i++){
free(&thread[i]);
free(&data[i]);
}
但是,我收到一个无效的指针错误。我对c有点新意,所以感谢任何指导。
P.S。:这就是结构的样子。
struct thread_data{
int base, //base term from which computation will start
num_terms; //numer of terms to compute
double result;
};
答案 0 :(得分:3)
对malloc()
的每次通话都应与free()
的一次通话完全匹配。
因此修改代码以释放问题中分配的内存,如下所示:
free(thread);
free(data);
更新:
请注意,malloc()
返回的值必须完全传递给free()
。
答案 1 :(得分:1)
你只需要做
free(thread);
free(data);
free
函数释放其参数指向的内存块。有关块大小的信息存储在内部,您不需要free
动态分配的数组的每个元素。
因此,当malloc
的返回值传递给free
时,它会释放分配的整个内存块。
答案 2 :(得分:0)
在这种情况下,它会发现您打算一次性删除所有线程和数据元素,因此接受的答案代表;但如果您确实想要在不同时间释放单个线程和数据项,则必须单独分配。例如:
pthread_t** thread; // Dynamic array of pointers to pthread_t
// Allocate pthread_t* array
threads = malloc(num_thread * sizeof(*thread));
// Allocate pthread_t elements
for( i = 0; i < num_threads; i++ )
{
thread[i] = malloc( sizeof(*thread[i]) ) ;
}
// Similarly for data...
清理更加微妙(也许容易出错):
free( thread[i] ) ;
thread[i] = 0 ; // Set pointer to null so element cannot be used after deletion
如果删除了所有线程元素,则可以删除线程指针数组:
free( thread ) ;
您可以清理所有操作:
for( i = 0; i < num_threads; i++ )
{
free( thread[i] ) ;
thread[i] = 0 ;
}
free( thread ) ;
thread = 0 ;
释放空指针是安全的,因此无需测试先前是否已删除某个元素,但在使用它之前需要对其进行测试。
请注意,取消引用空指针会被特意捕获为运行时错误,而取消引用过时指针会产生非确定性结果,并且在您进行某些无关更改的那一天导致代码时,通常会在代码中不被注意令人莫名其妙地崩溃 - 所以最好在解除分配后将指针设置为0 - 它将允许更早地检测到一些错误并且更容易修复。