4 Stimmen

withArray vs. newArray

Was ist in der Haskell FFI der wesentliche Unterschied zwischen Arrays, die mit withArray y newArray ? Ich habe eine Funktion in c, die funktioniert mit newArray aber Seg-Fehler mit withArray . Der Arbeitscode sieht in etwa so aus:

a <- newArray items
fficall a
free a

Der fehlgeschlagene Code sieht folgendermaßen aus:

withArray items fficall

Der Segfault tritt auf, wenn der ffi eine blas-Funktion betritt. Da ich den C-Code nicht zeigen darf, ist die Frage, "Bitte zeigen Sie mir ein Beispiel für eine c-Funktion, die auch bei withArray aber nicht mit newArray ."

3voto

hammar Punkte 136080

Soweit ich das beurteilen kann, newArray endet mit einem Anruf malloc um die Zuweisung vorzunehmen, während withArray ruft auf. allocaArray die in newAlignedPinnedByteArray# .

Vielleicht verlässt sich Ihre Funktion auf den Speicher, der von malloc zum Beispiel durch den Versuch, die realloc o free es?

2voto

pat Punkte 12485

Es sieht so aus newArray ordnet das Array auf dem Heap mit mallocArray (die ausdrücklich freigegeben werden müssen), aber withArray ordnet das Array auf dem Stack mit allocaArray (unter der Annahme, dass alloca verhält sich wie in C), die zurückverlangt wird, wenn die aufrufende Funktion zurückkehrt. Es ist möglich, dass Ihre Liste so groß ist, dass sie einen (Trommelwirbel) Stack Overflow verursacht hat.

Edit: Hmm, vielleicht doch nicht, es sieht so aus allocaArray weist ein gepinntes Array im Heap zu, wobei der Haskell-Speicher-Manager anstelle des C Haufen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X