func rank() -> Int { let cA: UnsafeMutablePointer<spasm> = spasm_init(A) defer { spasm_csr_free(cA) } let rank = spasm_rank_hybrid(cA) return Int(rank) }
spasm_
とついてるのが C のライブラリです。これを Ubuntu で実行すると spasm_csr_free(cA)
の中で Segmentation Fault が発生します。 spasm_csr_free
の中でポインタのアドレスを出力してみると、spasm_init
で返されるポインタのアドレスから微妙に変わっています。であれば spasm_rank_hybrid
の中で何者かがアドレスを書き換えてるのだろうと思いきや、この関数の return の直前でアドレスを出力してみても init
で返されるものと同じになっているのです… C と Swift の連携によってアドレスが書き換わってるとしか思えない感じです… しかも不気味なことに func rank() -> Int { let cA: UnsafeMutablePointer<spasm> = spasm_init(A) print(cA) // ← これを入れるだけ defer { spasm_csr_free(cA) } let rank = spasm_rank_hybrid(cA) return Int(rank) }
こうすると Seg-Fault が発生しなくなります… (edited)defer
が悪さをしてるのかと思って func rank() -> Int { let cA: UnsafeMutablePointer<spasm> = spasm_init(A) let rank = spasm_rank_hybrid(cA) spasm_csr_free(cA) return Int(rank) }
としてみましたが同じでしたspasm_init: 0x7f3051b1c8f0 start of spasm_rank_hybrid: 0x7f3051b1c8f0 end of spasm_rank_hybrid: 0x7f3051b1c8f0 spasm_csr_free: 0x7f3051b1c800
こういう感じで、アドレスが f0
分ズレるという…f0
ズレるんじゃなくて & 00
されるようです