0

下面的代码只是尝试使用 将值从一个指针复制到另一个指针,但大约有三分之一的时间cblas_ccopy会导致错误。malloc: *** error ... incorrect checksum for freed object为什么它总是不工作?

import Accelerate

func testCopy() {

    // set capacity
    let capacity: Int = 1000

    // destination array
    let destinationArray = UnsafeMutablePointer<Float>.allocate(capacity: capacity)
    destinationArray.initialize(repeating: 0, count: capacity)

    // source array
    let sourceArray = UnsafeMutablePointer<Float>.allocate(capacity: capacity)
    sourceArray.initialize(repeating: 1, count: capacity)

    // copy values
    cblas_ccopy(Int32(capacity),
                UnsafeRawPointer(sourceArray),
                1,
                UnsafeMutableRawPointer(destinationArray),
                1)

    // check to see if values were copied
    for idx in 0..<capacity {
        print(idx, destinationArray[idx])
    }
}

testCopy()

将其作为单元测试运行时,错误为objc[44736]: autorelease pool page 0x7fecb903c000 corrupted. 将其作为脚本运行时,错误为incorrect checksum.

我尝试在其中设置断点,malloc_error_break但我不明白如何解释输出。

我还尝试将sourceArray和作为参数传递destinationArraycblas_ccopy而不将它们转换为原始指针,但这并没有帮助。

4

2 回答 2

2

使用cblas_scopy而不是cblas_ccopy. cblas_ccopy复制(单精度)复数,其大小是您实际使用的单精度数的两倍,因此您超出了缓冲区的末尾。

于 2018-05-21T17:12:05.407 回答
1

中的c-prefix_ccopy表示元素类型是单精度复数。因此,在您的 中cblas_ccopy(Int32(capacity),...),两个指针都需要包含capacity单精度复数的2 * capacity元素,即单精度浮点数的元素。

您只需分配capacity单精度浮点数的元素。您可能知道当内存访问超过内存限制时会发生什么。

尝试将分配大小加倍:

let destinationArray = UnsafeMutablePointer<Float>.allocate(capacity: 2 * capacity)
destinationArray.initialize(repeating: 0, count: 2 * capacity)

// source array
let sourceArray = UnsafeMutablePointer<Float>.allocate(capacity: 2 * capacity)
sourceArray.initialize(repeating: 1, count: 2 * capacity)

// copy values
cblas_ccopy(Int32(capacity), //<- do not double here.
            UnsafeRawPointer(sourceArray),
            1,
            UnsafeMutableRawPointer(destinationArray),
            1)

(或者尝试分配capacity单精度复数的元素,而不是Float。)

于 2018-05-21T04:44:40.063 回答