为什么使用`cblas_ccopy`导致间歇性内存错误?

时间:2018-05-21 03:32:09

标签: swift accelerate-framework unsafe-pointers cblas

下面的代码只是尝试使用INSERT将值从一个指针复制到另一个指针,但是大约三分之一的时间会导致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_breaksourceArray作为参数传递给destinationArray,而不将它们转换为原始指针,但这没有帮助。

2 个答案:

答案 0 :(得分:2)

使用cblas_scopy代替cblas_ccopycblas_ccopy个复制(单精度)复杂数字,它们是您实际使用的单精度数字的两倍,因此您可以超越缓冲区的末尾。

答案 1 :(得分:1)

c中的_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。)