我一直在尝试双重间接(我最近徘徊于面向对象的c并且需要更好地理解指针),而且当我释放内存时,Instruments正在拾取内存泄漏。我越看它越开始看起来像是仪器(mac)的错误,但我想完全确定。我有四个malloc语句和四个自由语句,所以每次我分配内存时,我也会释放它。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, const char * argv[]) {
printf("test initializing\n");
printf("-----------------\n");
char **strings = (char**)malloc(sizeof(char*)*2); // MALLOC #1
char *string1 = "string1";
char *string2 = "string2";
*(strings + 0) = string1;
*(strings + 1) = string2;
printf("string1: %s\n", string1);
printf("string2: %s\n", string2);
printf("*(strings + 0): %s\n", *(strings + 0));
printf("*(strings + 1): %s\n", *(strings + 1));
// I know *(strings + 0) == *strings, I just liked that they lined up :)
free(strings), strings = NULL; // FREE #1
int address = (int)strings;
printf("address: %d\n", address);
printf("-----------------\n");
strings = (char**)malloc(sizeof(char*) * 2); // MALLOC #2
// Instruments is saying that this ^ malloc is not being freed.
printf("strings : %d\n", (int)strings);
printf("*strings : %d\n", (int)*strings);
printf("**strings : %d\n", (int)**strings);
printf("*(strings + 1) : %d\n", (int)*(strings + 1));
printf("-----------------\n");
*strings = (char*)malloc(sizeof(char) * 10); // MALLOC #3
*(strings + 1) = (char*)malloc(sizeof(char) * 10); // MALLOC #4
strncpy(*strings, "string1", 10);
strncpy(*(strings + 1), "string2", 10);
printf("strings : %p\n", strings);
printf("*strings : %p\n", *strings);
printf("*(strings + 1) : %p\n", *(strings + 1));
printf("*(strings + 0) : %s\n", *(strings + 0));
printf("*(strings + 1) : %s\n", *(strings + 1));
free(*strings), *strings = NULL; // FREE #2
free(*(strings + 1)), *(strings + 1) = NULL; // FREE #3
free(strings), strings = NULL; // FREE #4
printf("-----------------\n");
printf("test terminating\n");
return 0;
}
然后这是输出(显然,如果你运行它,指针地址将不相同):
test initializing
-----------------
string1: string1
string2: string2
*(strings + 0): string1
*(strings + 1): string2
address: 0
-----------------
strings : 1070176
*strings : 3677
**strings : 115
*(strings + 1) : 3685
-----------------
strings : 0x100105460
*strings : 0x100105470
*(strings + 1) : 0x100105480
*(strings + 0) : string1
*(strings + 1) : string2
-----------------
test terminating
如果我循环这个,内存泄漏不会增长 - 它仍然在一个对象泄漏。
答案 0 :(得分:1)
一些小的评论你没有包括strncpy(string.h)的原型
你还投出了malloc的返回值,这不是一件好事 - 它不是好习惯。如果您使用的是需要强制转换的C ++编译器,那么您应该使用delete/new
而不是malloc/free
。
除此之外你在做一些奇怪的事情
21 free(strings), strings = NULL; // FREE #1
22
23 int address = (int)strings;
24 printf("address: %d\n", address);
你自由,将其设置为NULL然后转换为int。