2015-09-19 2 views
2

Я изучаю C некоторое время, и я пишу код C для проекта. Я в основном пытался проверить использование структур. Я написал простой создавать и удалять метод для этого:Программа Small C делает 500+ mallocs?

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 

struct TokenizerT_ { 
    int index; 
}; 

typedef struct TokenizerT_ TokenizerT; 

TokenizerT *TKCreate(char * ts) { 
    TokenizerT *tk = (TokenizerT *)(malloc(sizeof(TokenizerT))); 

    if(tk == NULL) 
    return NULL; 

    tk->index = 0; 

    return tk; 
} 

void TKDestroy(TokenizerT * tk) { 
    free(tk); 
    return; 
} 

int main(int argc, char ** argv) 
{ 
    TokenizerT *tk = TKCreate(argv[1]); 
    printf("%lu\n", sizeof(tk->index)); 
    TKDestroy(tk); 
    return 0; 
} 

Таким образом, это компилируется и печатает 4, как ожидается, на моей машине. Однако, когда я побежал через Valgrind я получаю это:

==816== Memcheck, a memory error detector 
==816== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al. 
==816== Using Valgrind-3.11.0.SVN and LibVEX; rerun with -h for copyright info 
==816== Command: ./test 
==816== 
--816-- run: /usr/bin/dsymutil "./test" 
warning: no debug symbols in executable (-arch x86_64) 
4 
==816== 
==816== HEAP SUMMARY: 
==816==  in use at exit: 38,504 bytes in 415 blocks 
==816== total heap usage: 516 allocs, 101 frees, 45,484 bytes allocated 
==816== 
==816== LEAK SUMMARY: 
==816== definitely lost: 0 bytes in 0 blocks 
==816== indirectly lost: 0 bytes in 0 blocks 
==816==  possibly lost: 0 bytes in 0 blocks 
==816== still reachable: 0 bytes in 0 blocks 
==816==   suppressed: 38,504 bytes in 415 blocks 
==816== 
==816== For counts of detected and suppressed errors, rerun with: -v 
==816== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) 

Я не знаю, если это полезно, но моя машина OSX 10.10.5. Я действительно не знаю, как моя программа делает 501 mallocs.

+0

Если я помню, у Valgrind есть некоторые проблемы с последними версиями OS X. Попробуйте запустить вашу программу на машине Linux или виртуальной машине. – JAL

ответ

4

Это не ваш код; это код запуска, который протекает. Важнейшей информацией для вас является:

==816== LEAK SUMMARY: 
==816== definitely lost: 0 bytes in 0 blocks 
==816== indirectly lost: 0 bytes in 0 blocks 
==816==  possibly lost: 0 bytes in 0 blocks 
==816== still reachable: 0 bytes in 0 blocks 
==816==   suppressed: 38,504 bytes in 415 blocks 

Особенно последняя строка. Я использую версию Valgrind с тем же номером версии, но почти наверняка значительно старше, и мне пришлось добавить целую кучу подавлений. Кто-то, похоже, сделал это за вас.

Итак, не беспокойтесь об этом - на Mac OS X нормально работать с кучей «в использовании» или «подавленной» памятью.

Когда я запускаю это мягко взломанный вариант кода:

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 

struct TokenizerT_ { 
    int index; 
}; 

typedef struct TokenizerT_ TokenizerT; 

TokenizerT *TKCreate(char * ts); 
TokenizerT *TKCreate(char * ts) { 
    TokenizerT *tk = (TokenizerT *)(malloc(sizeof(TokenizerT))); 

    if(tk == NULL) 
    return NULL; 

    tk->index = strlen(ts); 

    return tk; 
} 

void TKDestroy(TokenizerT * tk); 
void TKDestroy(TokenizerT * tk) { 
    free(tk); 
    return; 
} 

int main(int argc, char ** argv) 
{ 
    TokenizerT *tk = TKCreate(argc > 1 ? argv[1] : "CogentConniptions"); 
    printf("%lu\n", sizeof(tk->index)); 
    TKDestroy(tk); 
    return 0; 
} 

Хаки были необходимы, чтобы избежать предупреждений компиляции по моим умолчанию параметры компиляции:

$ gcc -O3 -g -std=c11 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes \ 
>  -Wold-style-definition -Werror vg.c -o vg 
$ 

Когда я бегу, я получаю :

$ valgrind vg 
==31534== Memcheck, a memory error detector 
==31534== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al. 
==31534== Using Valgrind-3.11.0.SVN and LibVEX; rerun with -h for copyright info 
==31534== Command: vg 
==31534== 
--31534-- UNKNOWN mach_msg unhandled MACH_SEND_TRAILER option 
--31534-- UNKNOWN mach_msg unhandled MACH_SEND_TRAILER option (repeated 2 times) 
--31534-- UNKNOWN mach_msg unhandled MACH_SEND_TRAILER option (repeated 4 times) 
4 
==31534== 
==31534== HEAP SUMMARY: 
==31534==  in use at exit: 38,874 bytes in 418 blocks 
==31534== total heap usage: 519 allocs, 101 frees, 45,854 bytes allocated 
==31534== 
==31534== LEAK SUMMARY: 
==31534== definitely lost: 16 bytes in 1 blocks 
==31534== indirectly lost: 0 bytes in 0 blocks 
==31534==  possibly lost: 13,002 bytes in 109 blocks 
==31534== still reachable: 25,856 bytes in 308 blocks 
==31534==   suppressed: 0 bytes in 0 blocks 
==31534== Rerun with --leak-check=full to see details of leaked memory 
==31534== 
==31534== For counts of detected and suppressed errors, rerun with: -v 
==31534== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) 
$ 

И с моей ручной suppressions файла:

$ valgrind --suppressions=suppressions vg 
==31538== Memcheck, a memory error detector 
==31538== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al. 
==31538== Using Valgrind-3.11.0.SVN and LibVEX; rerun with -h for copyright info 
==31538== Command: vg 
==31538== 
--31538-- UNKNOWN mach_msg unhandled MACH_SEND_TRAILER option 
--31538-- UNKNOWN mach_msg unhandled MACH_SEND_TRAILER option (repeated 2 times) 
--31538-- UNKNOWN mach_msg unhandled MACH_SEND_TRAILER option (repeated 4 times) 
4 
==31538== 
==31538== HEAP SUMMARY: 
==31538==  in use at exit: 38,874 bytes in 418 blocks 
==31538== total heap usage: 519 allocs, 101 frees, 45,854 bytes allocated 
==31538== 
==31538== LEAK SUMMARY: 
==31538== definitely lost: 0 bytes in 0 blocks 
==31538== indirectly lost: 0 bytes in 0 blocks 
==31538==  possibly lost: 0 bytes in 0 blocks 
==31538== still reachable: 25,856 bytes in 308 blocks 
==31538==   suppressed: 13,018 bytes in 110 blocks 
==31538== Rerun with --leak-check=full to see details of leaked memory 
==31538== 
==31538== For counts of detected and suppressed errors, rerun with: -v 
==31538== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) 
$ 

Файл подавления, который у вас есть, делает работу лучше, чем моя.

+0

Итак, все, что мне нужно, это первые 4 строки сводки утечки? Есть ли способ решить эту проблему? – 1729

+0

Если вы имеете в виду «исправить подавленные утечки», вы можете присоединиться к команде Apple Mac OS X и решить проблемы, установив их время выполнения. Однако, вероятно, не стоит этого делать; программа собирается выйти к моменту утечки утечек. Поэтому в основном просто следите за «определенно потерянными», «косвенно потерянными» и «возможно потерянными» значениями, и старайтесь убедиться, что «все еще достижимые» и «подавленные» составляют около 38 ± KiB. Если вы видите, что эти цифры значительно больше, то что-то не так. Используйте опцию '--leak-check = full' и, возможно, даже избегайте встроенных запретов. –

+0

И да, мне страшно, что Mac OS X делает так много работы перед запуском программы. –