如何在C中释放malloc的2D数组?

以下是我的代码,我无法弄清楚释放2d数组出错的地方。 我知道错误发生在这一行:free(arr [i]);我也知道我必须执行此循环以释放每个整数,然后再释放整个数组。有人可以在这里发现错误吗?我没有编译错误,但是一旦运行我的可执行文件,免费功能就会有巨大的回溯输出。

    func fetchDataResult(for video: Video,completion: @escaping (Results<Any>) -> ()) {
        guard let videoKey = video.videoID else {
            preconditionFailure("Video expected to have a video id")
        }

        if let image = imageStore.image(forKey: videoKey) {
            OperationQueue.main.addOperation {
                completion(.success(image))
            }
            return
        }

        guard let videoURL = video.url else {
            preconditionFailure("Video expected to have video url")
        }

        let request = URLRequest(url: videoURL)

        let task = sessions.dataTask(with: request) { (data,response,error) in
            let result = self.processImageRequest(data: data,error: error)

            if case let .success(image) = result {
                self.imageStore.setImage(image,forKey: videoKey)
            }

            OperationQueue.main.addOperation {
                completion(result)
            }
        }
        task.resume()
    }

    private func processDataRequest(data: Data?,error: Error?) -> Results<Any> {

        guard
            let imageData = data,let image = UIImage(data: imageData) else {
                if data == nil {
                    return .failure(error!)
                } else {
                    return .failure(ThumbnailError.thumbnailCreationError)
                }
            }
        return .success(image)
    }
KK5566KK 回答:如何在C中释放malloc的2D数组?

您仅为arr[0] = (int*)malloc(sizeof(int) * w * h);分配内存,但是在释放分配的空间时,您正在释放h个计数,for (i=0; i<h; i++){free(arr[i]);}。您还应该使用相同的循环分配这种方式。

,

使用malloc时,仅分配数组的第一个位置

arr[0] = (int*)malloc(sizeof(int) * w * h);

这意味着,当您需要释放内存时,您需要先致电free(arr[0]),然后再致电free(arr)

这不会给你一个错误。

无论如何,我不认为这是您想要做的。您可能更希望采用以下解决方案:

int **arr = (int**)malloc(sizeof(int*) * h);

for (int i = 1; i < h ; ++i){
     arr[i] = (int*)malloc(sizeof(int) * w); // with the correct size you want
}    

这将在数组中分配h指针供使用,然后您可以像示例中那样释放内存

编辑:请注意,就像@AndrewHenle在其评论中正确指出的那样,该解决方案不会分配 true 2D数组,而只会分配指向数组的指针数组。有关正确分配2D数组的方法,请参见this相关问题

,

您在通话中分配的内存 arr[0] = (int*)malloc(sizeof(int) * w * h); 足以用于整个2D阵列。如果要使用这种方法,即在一次调用malloc的过程中为2D数组分配内存,则可以通过将返回的指针转换为w元素的数组指针来实现。然后,您也可以在一次调用中释放内存。无需使用for循环。请参见下面的代码。

int main()
{
    int h = 4;
    int w = 2;
    int i,j;

    int (*arr)[w] = (int(*)[w])malloc(sizeof(int)*h*w); // pointer to array of w ints

    int count = 0;
    for (i=0; i<h; i++) {
        for (j=0; j<w; j++) {
            arr[i][j] = count++;
        }
    }

    for (i=0; i<h; i++) {
        for (j=0; j<w; j++) {
            printf("Array[%d][%d] = %d ",i,j,arr[i][j]);
        }
        printf("\n");
    }

    free(arr);  //<-- free the 2D array in a single free
    return 0;
}
,
info.setHeading(true)
本文链接:https://www.f2er.com/3169092.html

大家都在问