Swift: невозможно освободить память - PullRequest
1 голос
/ 24 июня 2019

Я пытаюсь написать метод для изменения размера изображения, захваченного в Swift, но в моем функциональном цикле (который захватывает кадры в реальном времени) я получил ошибку, которая произошла после нескольких секунд захвата. Я понял, что не освобождаю память, поэтому я добавил для этого операторы отсрочки, но эти операторы отсрочки выдают ошибки malloc, указывающие, что я не выделил память, но я думаю, что правильно выделил память. Таким образом, я не могу освободить память, которую я выделяю.

Я пытался добавить операторы CVPixelBuffer (Un) LockBaseAddress, но это ничего не дало.

private func resizePixelBuffer(imageBuffer: CVPixelBuffer, scaleWidth: Int, scaleHeight: Int) -> CVPixelBuffer? {
        CVPixelBufferLockBaseAddress(imageBuffer, CVPixelBufferLockFlags(rawValue: 0))
        guard let baseAddress = CVPixelBufferGetBaseAddress(imageBuffer) else {return nil}
        let bytes_per_row = CVPixelBufferGetBytesPerRow(imageBuffer)
        let width = CVPixelBufferGetWidth(imageBuffer)
        let height = CVPixelBufferGetHeight(imageBuffer)

        // Allocate input buffer
        var inBuff = vImage_Buffer(data: baseAddress, height: vImagePixelCount(height), width: vImagePixelCount(width), rowBytes: bytes_per_row)
        defer { free(inBuff.data) } // ADDED

        // Allocate output container
        let outData = UnsafeMutablePointer<UInt8>.allocate(capacity: 4*scaleWidth*scaleHeight)
        defer { outData.deallocate() } // ADDED

        // Assign output buffer
        var outBuff = vImage_Buffer(data: outData, height: vImagePixelCount(scaleHeight), width: vImagePixelCount(scaleWidth), rowBytes: 4*scaleWidth)
        defer { free(outBuff.data) } // ADDED

        let releaseCallback: CVPixelBufferReleaseBytesCallback = {_, ptr in
            if let ptr = ptr {
                free(UnsafeMutableRawPointer(mutating: ptr))
            }
        }
        // Assign output data
        let error = vImageScale_ARGB8888(&inBuff, &outBuff, nil, vImage_Flags(kvImageHighQualityResampling))
        guard error == kvImageNoError else {return nil}
        CVPixelBufferUnlockBaseAddress(imageBuffer, CVPixelBufferLockFlags(rawValue: 0))

        ...
    }

python-ios-integration(2477,0x16cf5f000) malloc: *** error for object 0x10e84c000: pointer being freed was not allocated; python-ios-integration(2477,0x16cf5f000) malloc: *** set a breakpoint in malloc_error_break to debug

...