我正在开发一个C绑定应用程序,在该应用程序中,我使用Interfaces.C.Strings.New_String()
在Ada端分配一个新字符串。
Interfaces.C.Strings
已经有了一个用于释放字符串内存的过程Free()
。因为我需要使用Interfaces.C.Strings.Chars_Ptr
将这个字符串传递给C函数:
free()
函数(在stdlib.h中声明)为C端的字符串释放内存,可以吗?Interfaces.C.Strings.Free()
函数来释放它呢?发布于 2016-03-21 23:27:14
从C端调用Interfaces.C.Strings.Free
有两个问题。
首先,这个过程有Convention Ada
,所以您无法确定如何从C调用它,即使您的编译器是GNAT &因此是基于GCC的;如果不编辑和重建标准库,就不能更改它。
第二,它的声明是
procedure Free (Item : in out chars_ptr);
这意味着Item
是通过引用(char **item
)传递的,因此它可以为空。
您可以安排C端用包装调用Ada解除分配。我的观点是,应该保留Ada语义(在Free (Item)
之后,Item
设置为Null_Ptr
),这意味着要调用的消费C过程需要接受一个in out
参数,转换为char **
。
with Interfaces.C.Strings;
package String_Freeing is
procedure C_Consumer (Item : in out Interfaces.C.Strings.chars_ptr)
with
Import,
Convention => C,
External_Name => "c_consumer";
procedure Free_Wrapper (Item : in out Interfaces.C.Strings.chars_ptr)
with
Export,
Convention => C,
External_Name => "free_ada_string";
end String_Freeing;
(Free_Wrapper
必须在要导出的包中)
package body String_Freeing is
procedure Free_Wrapper (Item : in out Interfaces.C.Strings.chars_ptr) is
begin
Interfaces.C.Strings.Free (Item);
end Free_Wrapper;
end String_Freeing;
和测试程序
with Interfaces.C.Strings;
with String_Freeing; use String_Freeing;
procedure Test_String_Freeing is
Str : Interfaces.C.Strings.chars_ptr;
use type Interfaces.C.Strings.chars_ptr;
begin
Str := Interfaces.C.Strings.New_String ("hello world.");
C_Consumer (Str);
pragma Assert (Str = Interfaces.C.Strings.Null_Ptr, "str not nulled");
end Test_String_Freeing;
事情的C面可能在哪里
#include <stdio.h>
extern void free_ada_string(char **item);
void c_consumer(char **item) {
printf("%s\n", *item);
free_ada_string(item);
}
如果您愿意将悬空指针放在Ada端,则可以将字符串作为in
(char *
)参数传递,这将使Free_Wrapper
看起来像
package body String_Freeing is
procedure Free_Wrapper (Item : Interfaces.C.Strings.chars_ptr) is
Dummy : Interfaces.C.Strings.chars_ptr := Item;
begin
Interfaces.C.Strings.Free (Dummy);
end Free_Wrapper;
end String_Freeing;
(当然,规格要修改为匹配)。
发布于 2016-03-21 14:02:42
您应该释放Ada侧的这条字符串:
https://stackoverflow.com/questions/36133030
复制相似问题