因此,下面的java代碼segfaults在finalize期間。是什麼導致在此JNA包裝器中的段錯誤GMP
public class Mpz_t extends com.sun.jna.Structure {
public int _mp_alloc;
public int _mp_size;
public NativeLongByReference _mp_d;
protected void initFieldOrder() {
setFieldOrder(new String[] { "_mp_alloc", "_mp_size", "_mp_d" });
}
public Mpz_t() {
super();
initFieldOrder();
allocateMemory();
ensureAllocated();
}
public static class ByReference extends Mpz_t implements
Structure.ByReference {
}
public static class ByValue extends Mpz_t implements
Structure.ByValue {
}
@Override public void finalize() {
Gmp.gmp().__gmpz_clear(this);
}
}
.__gmpz_clear()
根據我的意識破壞C端的結構。如果我撕開那部分,沒有段錯誤,但是我的代碼會泄漏內存。任何人有關於此的想法?
我可能會補充說它並不可靠地發生段錯誤。在問題發生之前,它可能會正確地破壞這些結構中的20個。
問題出在C端。如果您沒有編寫代碼,請仔細檢查您是否正確使用庫。 – 2012-07-17 19:48:26
我很確定我正確地使用它。我的其他函數綁定工作得很好,我可以很好地計算它。在GMP文件,它說: _/*除非程序即將退出,做... */mpz_clear(INTEG); _ 的__gmpz_clear功能是java上面的代碼結合,並應只有當java/scala用struct對象完成時才被調用。 – MarkHammons 2012-07-17 19:50:16
作爲一種風格,allocateMemory()和ensureAllocated()是多餘的。如果您需要在構造函數中對所述內存執行某些操作,則只需調用ensureAllocated()(它又調用allocateMemory())。 – technomage 2012-07-17 20:01:51