따라서 아래 코드는 finalize 중에 segfaults입니다.GMP 용 JNA 래퍼에서 segfaults의 원인이 무엇입니까
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 측의 구조체를 파괴한다. 내가 그 부분을 찢어 버리면 segfault는 없지만 내 코드는 메모리를 누설합니다. 누구나 이것에 대한 아이디어가 있습니까?
안정적으로 분류되지 않는다고 추가 할 수 있습니다. 문제가 발생하기 전에 20 개 정도의 구조체를 적절히 파괴합니다.
문제는 C면에 있습니다. 코드를 작성하지 않았다면 라이브러리를 올바르게 사용하고 있는지 다시 한 번 확인하십시오. –
나는 그것을 올바르게 사용하고 있다고 확신한다. 다른 함수 바인딩은 훌륭하게 작동하며 매우 잘 계산할 수 있습니다. GMP 문서에서 다음과 같이 말합니다 : _/* 프로그램이 종료되지 않는 한 ... */mpz_clear (integ); _ __gmpz_clear 함수는 위의 코드에 대한 Java 바인딩이며, java/scala가 struct 객체로 완료 될 때만 호출됩니다. – MarkHammons
스타일의 문제로 allocateMemory() 및 ensureAllocated()가 불필요합니다. constructor 내에서 상기 메모리에 대해 몇 가지 연산을 수행해야하는 경우 ensureAllocated() (allocateMemory())를 호출하면됩니다. – technomage