2016-02-28 2 views
0

Код выделяет память для переменной «p», но я думаю, что она не может ее освободить, если в момент запуска этого кода нет ошибок. Я прав? Или он может бесплатно в другом месте программы?Это утечка памяти?

static NSVGparser* nsvg__createParser() 
{ 
    NSVGparser* p; 
    p = (NSVGparser*)malloc(sizeof(NSVGparser)); 
    if (p == NULL) goto error; 
    memset(p, 0, sizeof(NSVGparser)); 

    p->image = (NSVGimage*)malloc(sizeof(NSVGimage)); 
    if (p->image == NULL) goto error; 
    memset(p->image, 0, sizeof(NSVGimage)); 

    // Init style 
    nsvg__xformIdentity(p->attr[0].xform); 
    memset(p->attr[0].id, 0, sizeof p->attr[0].id); 
    p->attr[0].fillColor = NSVG_RGB(0,0,0); 
    p->attr[0].strokeColor = NSVG_RGB(0,0,0); 
    p->attr[0].opacity = 1; 
    p->attr[0].fillOpacity = 1; 
    p->attr[0].strokeOpacity = 1; 
    p->attr[0].stopOpacity = 1; 
    p->attr[0].strokeWidth = 1; 
    p->attr[0].strokeLineJoin = NSVG_JOIN_MITER; 
    p->attr[0].strokeLineCap = NSVG_CAP_BUTT; 
    p->attr[0].fillRule = NSVG_FILLRULE_NONZERO; 
    p->attr[0].hasFill = 1; 
    p->attr[0].visible = 1; 

    return p; 

error: 
    if (p) { 
     if (p->image) free(p->image); 
     free(p); 
    } 
    return NULL; 
} 

ответ

1

клиентский код, как ожидается, вызвать функцию nvsg_deleteParser() после использования возвращенного парсер, чтобы освободить свои выделенные ресурсы:

NSVGparser *parser = nsvg__createParser(); 
if (parser) 
{ 
    ... 
    nvsg_deleteParser(parser); 
} 
Смежные вопросы