C中双间接的内存泄漏(可能)

时间:2014-12-09 10:14:40

标签: c memory memory-leaks instruments

我一直在尝试双重间接(我最近徘徊于面向对象的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

如果我循环这个,内存泄漏不会增长 - 它仍然在一个对象泄漏。

1 个答案:

答案 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。