概述:如何巧妙使用 goto
Goto 妙用
当一个条件不满足,函数要退出时,已经申请的内存没有释放,但是又需要return的情况下,可以使用goto
以下边的函数为例,在判断if(pRet[i] == NULL)
时,如果为空时,如果直接return
的话,那么已经申请内存的pRet
则成了流浪儿,未能完全释放。在这种情况下就可以使用return
语句直接调到程序的末尾去执行释放的操作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
|
int** Merge(_In_ int** intervals, _In_ int intervalsSize, _In_ int* intervalsColSize, _Out_ int* returnSize, _Out_ int** returnColumnSizes) {
if(intervalsSize == 1) { return intervals; }
int nItem = 0;
qsort(intervals, intervalsSize, sizeof(int *), Compare);
int **pRet = (int**)malloc(sizeof(int*)*ARRSIZE_MAX_N);
if(pRet == NULL) { return NULL; }
for(int i=0; i<intervalsSize; i++) { pRet[i] = (int*)malloc(sizeof(int)*intervalsColSize[0]);
if(pRet[i] == NULL) { - return NULL; + goto END; } memset(pRet[i],0,sizeof(int)*intervalsColSize[0]); }
pRet[nItem][0] = intervals[0][0]; pRet[nItem][1] = intervals[0][1];
for(int i=0; i < intervalsSize; i++) { if(intervals[i][0] <= pRet[nItem][1] && intervals[i][1] >= pRet[nItem][1]) { pRet[nItem][1] = intervals[i][1]; } else if(intervals[i][0] > pRet[nItem][1]) { (nItem)++; pRet[nItem][0] = intervals[i][0]; pRet[nItem][1] = intervals[i][1]; } }
*returnSize = nItem + 1; *returnColumnSizes = intervalsColSize;
return pRet;
+END: + free(pRet); + return NULL; }
|