我有一个指针*** resultSet,我将其作为参数传递给我的SQL函数,该函数从数据库中读取未知数量的数据。数据的实际处理发生在函数之外。
当清理这个指针构造时,我是否只需释放一次主指针并且free找到所有后续分配,或者我是否必须释放我创建的每个malloc?
while((row = mysql_fetch_row(result))) {
// allocating the rows pointer
resultSet = malloc(sizeof(void)*(int)mysql_num_rows);
(*rows)++;
for (i=0 ; i < mysql_num_fields(result); i++)
{
// allocating the fields pointer
*(resultSet+i) = malloc(sizeof(void)*(int)mysql_num_fields);
// allocating the character pointer
**resultSet = malloc(sizeof(char)*strlen(row[i])+1);
(*fields)++;
snprintf(**resultSet, strlen(row[i])+1, "%s", row[i]);
printf("%s\t",**resultSet);
if (i==6)
{
printf("\t %s\n",**resultSet);
}
}
}
答案 0 :(得分:9)
作为一般规则,对于每个malloc()
,您都有free()
。
答案 1 :(得分:1)
free()
释放ptr
指向的内存空间,该内存空间必须由之前调用malloc()
,calloc()
或realloc()
返回。< / p>
它完全按照它的说法 - 释放指向的内存。它不会查看存储在存储器中的内容;它不知道任何其他分配的内存。它只是释放你告诉它的东西。所以,正如其他人所说,如果你想释放你分配的所有内存,你必须free
malloc
编辑的所有内容。
(也许你在考虑C ++的更复杂的行为,当你破坏一个对象时,它的成员也会被破坏?)
答案 2 :(得分:0)
您必须为您声明的每个free()
致电malloc()
以防止内存泄漏。
答案 3 :(得分:0)
您需要基本上反向工作并释放每个分配。