2016-11-24 44 views
-1

所以我想优化我的记忆在我的代码管理。Malloc和免费的功能(优化你的记忆)

下面的代码的示例:

Image image; 

    int main(int argc, char *argv[]) 
    { 

    image = (Image) malloc(sizeof (struct image)); 

    image = doSomething(image); 


    } 

    Image doSomething(Image imageInput) { 
    Image imageResult; 

    imageResult = (Image) malloc(sizeof (struct image)); 

    //Code does something here 

    return imageResult; 

    } 

当它是适当的使用免费的();在我的例子?

Image image; 

int main(int argc, char *argv[]) 
{ 

image = (Image) malloc(sizeof (struct image)); 

image = doSomething(image); 


free(image); 
} 

Image doSomething(Image imageInput) { 
Image imageResult; 

imageResult = (Image) malloc(sizeof (struct image)); 

//Code does something here 

free(imageInput); 
return imageResult; 

} 

唯一一次我可以看到是supossed在功能被复制和被假设函数结束之后要被擦除的“imageInput”变量。

释放函数变量是矫枉过正吗?

也在应用程序执行结束时。

+0

*您不能*'free'函数变量:您可以将其与功能的'malloc'家庭只分配'free'内存。无论如何,当你退出函数时,函数变量的生命结束。 –

+1

[请参阅此讨论,为什么不在'C'中为malloc()'和family生成返回值。](http://stackoverflow.com/q/605845/2173917)。 –

+1

通过(大概)定义一个指向图像类型的指针,你不清楚你正在分配什么,以及有多少。 'image =(image)malloc(sizeof(struct image));''''''''因为您已经使用了'image' *和*'struct image',所以''看起来很吝啬,并且您是否只为'pointer'分配足够的内存还不清楚。定义指针类型的做法很糟糕。 –

回答

0

你必须制定有关使用你的图像处理功能的习惯。我不认为你的榜样是坏的。但我认为你可以做得更好。

这是唯一的例子,但我认为你可以做这样的事情:

struct image *img_alloc() 
{ 
    return malloc(sizeof(struct image)); 
} 

void img_free(struct image **a) 
{ 
    free(*a); 
    *a = NULL; 
} 

struct image **img_add(struct image **dstp, struct image const *lhs, struct image const *rhs) 
{ 
    struct image *dst = img_alloc(); 
    ... 
    img_free(dstp); 
    *dstp = dst; 
    return dstp; 
} 

int main(int argc, char *argv[]) 
{ 
    struct image *img = NULL; 
    ... 
    img_add(&img, a, b); 
    ... 
    img_add(&img, img, c); 
    ... 
    img_add(&img, *img_add(&img, img, a), b); 
    ... 
    img_free(&img); 

    return 0; 
} 
0

最后我用的valgrind分析任何内存泄漏。

非常有帮助指导某人进入这项任务。帮助我学习何时做一个免费()和在哪里。

这里是一个有用的链接: Valgrind website