이 오류가 발생하고 설명서를 읽은 후에도 그 의미를 이해할 수 없습니다. 사실, 나는 그것을 이해했다고 생각했지만 그것은 나에게 일어난 방식과 맞지 않았습니다. 인터넷의 다른 곳에서는 이 특정 문제에 대한 다른 정보가 없는 것 같습니다.
저에게는 이 기능에서 이런 일이 발생했습니다(내 라이브러리가 아니라 여러 곳에서 잘 작동하는 것 같아서 이것이 더 이상합니다).
오류를 더 잘 이해하기 위해 C 함수의 각 매개변수가 별도로 구성되고 어떤 부분이 오류를 유발했는지 확인하도록 로컬에서 수정했습니다.
그런데 커서 아래 줄에서 오류가 발생하는 것으로 확인되어 전적으로 C.lmdbgo_mdb_cursor_get1()
호출과 관련이 있는 것으로 생각됩니다.
나는 이 오류가 Go 포인터를 C 함수에 전달하고 Go 포인터를 unsafe.Pointer()
호출로 래핑하여 문제를 해결할 수 있다는 의미라고 생각했지만 이미 완료되었고 모든 인수가 관련 함수에 대한 것이므로 이는 불가능합니다. C 함수는 이미 Go 유형이 아닌 C 유형입니다.
업데이트: 좀 더 조사한 결과 실제 panic()
是在 /src/runtime/cgocall.go
의 689행이 발행된 것을 발견했습니다.
따라서 cgoIsGoPointer()
返回 true
且 isPinned()
는 false를 반환합니다.
Go 포인터를 어떻게 "고정"할 수 있나요? 아니면 잘못된 질문인가요?
업데이트: 추가로 조사한 결과 문제를 일으키는 매개 변수가 c.txn.key
라는 것을 발견했습니다. 이는 내 제어 범위를 벗어났으며 new(C. MDB_val)
. c.txn.key
,它超出了我的控制范围,似乎被设置为 new(C. MDB_val)
。
根据https://github.com/PowerDNS/lmdb-go/issues /28 这个问题实际上是由使用 Go new()
构造函数创建 C 指针然后传递给 C 函数引起的。这些应该是使用 C.malloc()
기준 https:// github .com/PowerDNS/lmdb-go/issues /28 이 문제는 실제로 Go new()
생성자를 사용하여 C 포인터를 생성한 다음 이를 C 함수에 전달함으로써 발생합니다. . C.malloc()
을 사용하여 생성해야 합니다.
위 내용은 신비한 오류: 'cgo 매개변수에 대한 Go 포인터가 고정되지 않은 Go 포인터를 가리킵니다.'의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!