Ich habe eine Funktion, die einen char * Zeiger in C zurückgibt, wie diese, ich zuweisen diese (mit iso_c_binding)Freigeben eines C-Zeigers, der von einer C-Funktion an Fortran zurückgegeben wird?
type (c_ptr) :: C_String_ptr
...
C_String_ptr = string_val (ARGS)
Dieses Teil funktioniert gut mit einem C-Zeiger
char * string_val (ARGS)
{
char * svalue = cJSON_GetObjectItem(nml,var_name)->valuestring;
return svalue;
}
In Fortran sieht . Die Funktion string_val wird sehr oft aufgerufen, und ich denke, es verursacht einen Speicherverlust. Ich versuche, den Speicher des Svalue-Zeigers freizugeben, aber ich habe gerade in seg-Fehler und Speicherauszüge geraten. Im Moment habe ich so etwas wie diese:
subroutine c_mem_free (cptr) bind(C,name="c_mem_free")
use iso_c_binding
type (c_ptr) :: cptr !< The C pointer whose memory needs to be freed
end subroutine
...
call c_mem_free(C_String_ptr)
wo
void c_mem_free (void** addrOfptr)
{
free(*addrOfptr); /* free the memory pointed to */
*addrOfptr=NULL; /* Nullify the pointer ;) */
}
Die Traceback-Punkte für ein Problem auf der freien Linie. Ich habe auch versucht, ändern cptr zu Wert so type (c_ptr),VALUE :: cptr
und mit void*addrOfptr
und free(addrOfptr)
auf der C-Seite, aber das schien auch nicht zu arbeiten. Es ist mir auch nicht gelungen, den Speicherort von svalue auf der Fortran-Seite zu finden. Wenn ich so etwas wie
write (6,'(z)')loc(C_String_ptr) write (6,'(z)')loc(c_loc(C_String_ptr))
beides nicht verwenden, gibt mir den gleichen Wert wie wenn ich die Stelle des Speichers von sValue printf. Wie kann ich den Speicher des Zeiger svalue freigeben, nachdem es in Fortran zurückgegeben wurde? Wie kann ich den Speicherort des Svalue-Speichers in Fortran erhalten?
Welcher Mechanismus wird von cJSON zur Verfügung gestellt, um den Speicher freizugeben, wenn das Programm vollständig in C geschrieben wurde? Wenn man bedenkt, dass Sie kein explizites malloc haben, denke ich, dass jedes Speicherleck, das Sie haben, aufgrund des von cJSON zugewiesenen Speichers auftritt, nein? Wenn dies der Fall ist, würde ich meinen, dass "c_mem_free" auch den von cJSON bereitgestellten Mechanismus verwenden sollte.Ein Fehlerbehebungsschritt wäre, ein kleines Programm mit einer solchen cJSON-Zuweisung in eine Schleife zu schreiben und zu versuchen, das Speicherleck zuerst mit dem gesamten Programm in C und dann mit C + Fortran zu demonstrieren. –
Ich denke, ein JSON-Tag sollte hinzugefügt werden. Ich weiß nicht welche, also werde ich das nicht machen. –
@ DouglasB.Staple 'für (a = 1; a <1000000; a = a + 1) { cJSON * nml = getnml (mein_json_string, nml_name, var_name); svalue = cJSON_GetObjectItem (nml, var_name) -> Wertstring; // Finde den Zeichenfolgenwert frei (nml); frei (svalue); if (a% 10000 == 0) {printf ("a/n");} ' Das erzeugt kein Leck. Die Erinnerung bleibt ungefähr gleich. Ohne free (svalue) geht der verwendete Speicher weit nach oben. cJSON hat eine cJSON_free, die nur frei verwendet. – byrdman1982