user-0 提问: 函数返回值，用了malloc 申请内存，如何释放呢？

回复:
user: user-1
content: free释放

user: user-2
content: 引用 16 楼 wanyeye 的回复:[quote=引用 15 楼 lq5672 的回复:] 个人感觉。LZ这段代码不是很好。解决的办法上面已经给了。  个人建议，内存申请和释放尽量不要跨函数，除法是一个类内可以统一调度。  可以改成 bool analyData(const char * buf,const int bufLen，char * payloadData);  调用者申请释放payloadData。  现在就改成这样了 呵呵  [/quote]  这样也不太好，因为有的时候无法预测需要多大空间。 我觉得比较简单的做法是：提供两个函数，一个用于正常的处理，另一个用于销毁内存。（为什么不在调用方直接free，而必须专门提供销毁函数，请自行百度）  简便做法：用守卫或者智能指针或者……，在调用方出了某个作用域的时候，自动调用销毁内存的函数。

user: user-0
content: 引用 15 楼 lq5672 的回复:个人感觉。LZ这段代码不是很好。解决的办法上面已经给了。  个人建议，内存申请和释放尽量不要跨函数，除法是一个类内可以统一调度。  可以改成 bool analyData(const char * buf,const int bufLen，char * payloadData);  调用者申请释放payloadData。  现在就改成这样了 呵呵

user: user-3
content: 个人感觉。LZ这段代码不是很好。解决的办法上面已经给了。  个人建议，内存申请和释放尽量不要跨函数，除法是一个类内可以统一调度。  可以改成 bool analyData(const char * buf,const int bufLen，char * payloadData);  调用者申请释放payloadData。

user: user-4
content: 8楼正解，但是最好把free调的指针置NULL吧，安全点

user: user-5
content: 这块内存不需要的时候，直接free。

user: user-6
content: 引用 3 楼 wanyeye 的回复:[quote=引用 2 楼 D_PCA 的回复:] 这是在子函数中申请的内存吧。用free函数就释放掉了么。不过不要在这个子函数内释放，否则这个函数就没意义了。 是对  函数内释放就没意义了  只好用数组替代了？   [/quote]    我想2楼的意思是，如果你在一个函数里malloc，但是不在这个函数里free，这样的设计不好，但是并不是错的～～～ 你在一个函数里malloc，然后返回这个地址，在外面free，也可以的

user: user-7
content: 你调用函数后再释放。 char *callFunc = analyData(); ... free(callFunc);

user: user-8
content: malloc不是对应free吗

user: user-9
content: 这是在子函数中申请的内存吧。用free函数就释放掉了么。不过不要在这个子函数内释放，否则这个函数就没意义了。

user: user-10
content: 直接free不可以吗?

user: user-11
content: 仅供参考：#include <stdio.h> #include <stdlib.h> #include <malloc.h> int **newarr2d(int rows,int cols) {     int **p,i;      p=(int **)malloc(rows*sizeof(int *));     if (NULL==p) exit(1);     for (i=0;i<rows;i++) {         p[i]=(int *)malloc(cols*sizeof(int));         if (NULL==p[i]) exit(1);     }     return p; } void deletearr2d(int **p,int rows) {     int i;      for (i=0;i<rows;i++) {         free(p[i]);     }     free(p); } int main() {     int **arr2d,i,j,r,c;      r=4;     c=5;     //在堆中开辟一个4×5的二维int数组     arr2d=newarr2d(r,c);     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             arr2d[i][j]=i*c+j;         }     }     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             printf(" %2d",arr2d[i][j]);         }         printf("\n");     }     deletearr2d(arr2d,r);      r=6;     c=3;     //在堆中开辟一个6×3的二维int数组     arr2d=newarr2d(r,c);     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             arr2d[i][j]=i*c+j;         }     }     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             printf(" %2d",arr2d[i][j]);         }         printf("\n");     }     deletearr2d(arr2d,r);      return 0; } //  0  1  2  3  4 //  5  6  7  8  9 // 10 11 12 13 14 // 15 16 17 18 19 //  0  1  2 //  3  4  5 //  6  7  8 //  9 10 11 // 12 13 14 // 15 16 17 //

user: user-11
content: 引用 4 楼 wanyeye 的回复:更可气的是，这函数在 Linux下是正常的  移植到windows下，就不行 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。

user: user-12
content: 引用 3 楼 wanyeye 的回复:函数内释放就没意义了  只好用数组替代了？  不是， 你在调用这个函数的地方， 记录下这个函数的返回值（一个指针）， 使用了返回值之后， 就可以free掉这个指针了。  这段代码在windos下也可以运行，就你贴出来的代码中都是标准c的东西， 没有linux的库函数。除非省略的地方有linux库函数。

user: user-0
content: 更可气的是，这函数在 Linux下是正常的  移植到windows下，就不行

user: user-0
content: 引用 2 楼 D_PCA 的回复:这是在子函数中申请的内存吧。用free函数就释放掉了么。不过不要在这个子函数内释放，否则这个函数就没意义了。 是对  函数内释放就没意义了  只好用数组替代了？

user: user-13
content: free (analyData (buf, 2048));

user: user-9
content: 引用 3 楼 wanyeye 的回复:[quote=引用 2 楼 D_PCA 的回复:] 这是在子函数中申请的内存吧。用free函数就释放掉了么。不过不要在这个子函数内释放，否则这个函数就没意义了。 是对  函数内释放就没意义了  只好用数组替代了？   [/quote]  在程序中，一个malloc对应一个free，哪怕malloc在子函数中，free在主函数中。 你这个函数的作用应该是返回一个字符串，但是实际返回的是指向字符串首地址的指针。所以如果不在函数内部malloc，而是简单地直接char payloadData[254]，那么，函数返回后，程序会自动把函数中开辟的空间释放掉，自然也就把那个字符串释放掉了。所以你返回的指针会指向一个莫名其妙的玩意儿。只有malloc，才能保证函数返回后内存不会被释放掉。这就是我说函数内释放就没有意义了。  但是释放是必须要做的事情。只要你还能找得到你malloc后的那个地址，哪怕变量名改变了，也可以直接free的。  参考下这个：http://blog.163.com/lover_j_j/blog/static/16824744720072124301222/