为什么我得到双倍免费?
Why I get double free?
这是我的代码。我尝试 malloc 已经 malloc 的元素,但我不知道如何释放它们。
char *d = "apple";
int main() {
char *a = malloc(10 * sizeof(char));
char **b = &a;
strcpy(a,d);
printf("%c", *b[0]);
b[0] = malloc(3 * sizeof(char));
free(b[0]);
free(a);
}
之后
char **b = &a;
b[0]
等同于 a
。所以当你这样做时
b[0] = malloc(3 * sizeof(char));
您正在用这个新分配替换 a
的值。
那么free(b[0])
和free(a);
是一样的。所以如果你同时执行这两个操作,你将释放相同的内存两次,这是双重释放。
您还泄露了分配给 a
的原始分配,因为您不再有指向它的指针。您需要另一个变量来保存它,以便释放它。
char *d = "apple";
int main() {
char *a = malloc(10 * sizeof(char));
char **b = &a;
strcpy(a,d);
printf("%c", *b[0]);
char *c = a; // save a before overwriting it below
b[0] = malloc(3 * sizeof(char));
free(b[0]);
free(c);
}
这是我的代码。我尝试 malloc 已经 malloc 的元素,但我不知道如何释放它们。
char *d = "apple";
int main() {
char *a = malloc(10 * sizeof(char));
char **b = &a;
strcpy(a,d);
printf("%c", *b[0]);
b[0] = malloc(3 * sizeof(char));
free(b[0]);
free(a);
}
之后
char **b = &a;
b[0]
等同于 a
。所以当你这样做时
b[0] = malloc(3 * sizeof(char));
您正在用这个新分配替换 a
的值。
那么free(b[0])
和free(a);
是一样的。所以如果你同时执行这两个操作,你将释放相同的内存两次,这是双重释放。
您还泄露了分配给 a
的原始分配,因为您不再有指向它的指针。您需要另一个变量来保存它,以便释放它。
char *d = "apple";
int main() {
char *a = malloc(10 * sizeof(char));
char **b = &a;
strcpy(a,d);
printf("%c", *b[0]);
char *c = a; // save a before overwriting it below
b[0] = malloc(3 * sizeof(char));
free(b[0]);
free(c);
}