我正在尝试模仿以下Java代码:
int[][] multi; // DIMENSIONS ARE UNKNOWN AT CREATION TIME // LATER ON... multi = new int[10][]; multi[5] = new int[20]; multi[5][11] = 66; // LATER ON... multi = null; // PROPER WAY OF FREEING EVERYTHING
我推出了以下Objective-C版本:
int* *multi; // multi = malloc(10 * sizeof(int*)); multi[5] = (int *) malloc(20 * sizeof(int)); multi[5][11] = 66; // free(multi[5]); free(multi);
首先,我想知道这是否是最佳方式.而且主要是:我找不到以某种"自动"方式释放内存的方法,即以下代码导致iPhone上的运行时异常:
for (int i = 0; i < 10; i++) { if (multi[i] != NULL) free(multi[i]); }
Jason Coco.. 7
Free不会将指针中的内存地址清零,只会使其无效.因此,如果您不止一次运行此循环,则在尝试释放已经失效的内存时会出现异常.您可以使用NSPointerArray或将整数包装在对象中并使用NSMutableArray用于您的目的,但如果您只想使用您拥有的,并且您不止一次运行循环,则必须执行以下操作:
int **multi; multi = calloc(10, sizeof(int*)); multi[5] = calloc(20, sizeof(int)); // multi[5][11] = 66; // for( int i = 0; i < 10; i++ ) { if( multi[i] ) { free(multi[i]); multi[i] = NULL; } } // free(multi);
这样,如果循环运行多次,您将不会失败.另外,我使用calloc而不是malloc,因为它将所有指针设置为NULL,整数设置为0.第一个参数是所需数组的大小(在您的情况下),第二个参数是类型的大小(所以不需要乘法).
Free不会将指针中的内存地址清零,只会使其无效.因此,如果您不止一次运行此循环,则在尝试释放已经失效的内存时会出现异常.您可以使用NSPointerArray或将整数包装在对象中并使用NSMutableArray用于您的目的,但如果您只想使用您拥有的,并且您不止一次运行循环,则必须执行以下操作:
int **multi; multi = calloc(10, sizeof(int*)); multi[5] = calloc(20, sizeof(int)); // multi[5][11] = 66; // for( int i = 0; i < 10; i++ ) { if( multi[i] ) { free(multi[i]); multi[i] = NULL; } } // free(multi);
这样,如果循环运行多次,您将不会失败.另外,我使用calloc而不是malloc,因为它将所有指针设置为NULL,整数设置为0.第一个参数是所需数组的大小(在您的情况下),第二个参数是类型的大小(所以不需要乘法).