【发布时间】:2016-08-17 13:36:46
【问题描述】:
我有一个函数,它在 C 中返回一个 char * 指针,看起来像这样
char * string_val (ARGS)
{
char * svalue = cJSON_GetObjectItem(nml,var_name)->valuestring;
return svalue;
}
在 Fortran 中,我将其分配给 C 指针(使用 iso_c_binding)
type (c_ptr) :: C_String_ptr
...
C_String_ptr = string_val (ARGS)
这部分效果很好。 string_val 函数被调用了很多,我认为它会导致内存泄漏。我正在尝试释放 svalue 指针的内存,但我刚刚遇到了 seg 错误和内存转储。我目前有这样的事情:
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)
在哪里
void c_mem_free (void** addrOfptr)
{
free(*addrOfptr); /* free the memory pointed to */
*addrOfptr=NULL; /* Nullify the pointer ;) */
}
回溯指向空闲线路上的问题。我也尝试将更改 cptr 传递给 value 所以
type (c_ptr),VALUE :: cptr
并且在 C 端有void*addrOfptr 和free(addrOfptr),但这似乎也不起作用。我也没有成功在 Fortran 端找到 svalue 的内存位置。如果我使用类似的东西
write (6,'(z)')loc(C_String_ptr)
write (6,'(z)')loc(c_loc(C_String_ptr))
这些都没有给我与 printf svalue 内存位置相同的值。 在 Fortran 中返回指针 svalue 后,如何释放它的内存?如何在 Fortran 中获取 svalue 内存的位置?
【问题讨论】:
-
如果程序完全用C编写,cJSON提供了什么机制来释放内存?考虑到您没有明确的 malloc,我认为由于 cJSON 分配的内存而发生的任何内存泄漏,不是吗?如果是这种情况,我认为您的
c_mem_free也应该使用 cJSON 提供的任何机制。一个故障排除步骤是编写一个在循环中分配此类 cJSON 的小程序,并尝试演示内存泄漏,首先使用 C 语言编写整个程序,然后使用 C+Fortran。 -
我认为应该添加一个 json 标签。我不知道是哪一个,所以我不会这样做。
-
@DouglasB.Staple
for ( a = 1; a < 1000000; a = a + 1 ){ cJSON * nml = getnml (my_json_string, nml_name , var_name); svalue = cJSON_GetObjectItem(nml,var_name)->valuestring; // Find the string value free (nml); free (svalue); if (a % 10000 == 0) {printf("a /n");}这不会产生泄漏。记忆保持不变。如果没有空闲(svalue),使用的内存就会增加。 cJSON 确实有一个 cJSON_free,它只使用 free。 -
cJSON 似乎在这里 github.com/DaveGamble/cJSON 并且它有 cJSON_Delete 但我找不到 getnml()。这是一个用于读取 Fortran 名称列表(在其中创建 cJSON)的包装器吗?
-
@roygvib 它是一个包装器。 fortran namelist 转换为 json,然后 cJSON 用于获取变量的值。
标签: c pointers memory fortran fortran-iso-c-binding