下面的代码只是尝试使用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_break
和sourceArray
作为参数传递给destinationArray
,而不将它们转换为原始指针,但这没有帮助。
答案 0 :(得分:2)
使用cblas_scopy
代替cblas_ccopy
。 cblas_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
。)