在我的程序中,我有一些malloc和realloc调用,但由于某种原因,当我对我调用的那些调用free时,它仍然指向它们有直接泄漏。
变量名称在前面被声明为char**名称,直到下面才被初始化。我在不同的参数下重新分配和分配名称,所以我不知道最后如何释放它。我会只遍历整个名称数组一次吗?还是我必须做多次?
names = malloc(size * sizeof(char *)); //MALLOC
names[0] = malloc(2 * sizeof(char)); //MALLOC
names[0] = "0 ";
names[1] = malloc(2 * sizeof(char)); //MALLOC
names[1] = "1 ";
int i;
for (i = 0; i < icount; i++) {
names[i + 2] = malloc(17 * sizeof(char)); //MALLOC
fscanf(file, "%*[: ]%16s", names[i + 2]);
}
names = realloc(names, size * sizeof(char *)); //REALLOC
for (i = 0; i < ocount; i++) {
names[i + icount + 2] = malloc(17 * sizeof(char)); //MALLOC
fscanf(file, "%*[: ]%16s", names[i + icount + 2]);
}
for (i = 0; i < numOutputs; i++) {
fscanf(file, "%*[: ]%16s", v);
int idx = indexOf(size, names, v);
if (idx == -1) {
size++;
tcount++;
names = realloc(names, size * sizeof(char *)); //REALLOC
names[size - 1] = malloc(17 * sizeof(char)); //MALLOC
strcpy(names[size - 1], v);
step.outputs[i] = size - 1;
}
if (!steps) {
steps = malloc(sizeof(struct directive)); //MALLOC
} else {
steps = realloc(steps, scount * sizeof(struct directive)); //REALLOC
}
此处存在内存泄漏:
names[0] = malloc(2 * sizeof(char)); //MALLOC
names[0] = "0 ";
names[1] = malloc(2 * sizeof(char)); //MALLOC
names[1] = "1 ";
分配空间并将指向该空间的指针分配给names[0]
,然后立即用指向字符串常量的指针覆盖指向已分配空间的指针。names[1]
也有同样的问题。
使用strcpy
将字符串复制到分配的内存中:
names[0] = malloc(2 * sizeof(char)); //MALLOC
strcpy(names[0], "0");
names[1] = malloc(2 * sizeof(char)); //MALLOC
strcpy(names[1], "1");
还要注意,字符串常量是隐式以null结尾的,因此不需要手动添加。