c++ 如何从CPP取消分配Ada记录

5tmbdcev  于 2022-12-05  发布在  其他
关注(0)|答案(1)|浏览(141)

我试图从cpp中释放一个堆分配的Ada标记记录。我使用代码AdacoreU作为起始位置。
我在运行下面的代码时收到以下错误。

20
double free or corruption (out)

raised PROGRAM_ERROR : unhandled signal

我是不是想太多了?我需要一个基于Ada的释放机制吗?
我真实的的最终目标是什么?我想使用动态库来创建一个插件基础结构,其中每个库都是它自己的工厂,用于给定的类型。沿着于boost dll,但使用基于ada的动态库。
修改以下代码:
main.cpp
alib.ads
alib.adb
其他资源用作起点
3.11.3.5 Interfacing with C++ at the Class Level
我尝试了什么:

  • 尝试创建Free过程时使用了类型和访问类型的各种组合
  • 动物,类型Animal_Access是动物访问权限
  • Animal'类,类型Animal_Class_Access是对Animal'类访问
  • Animal,类型Animal_Access是对Animal类访问
  • 在某个时候,我有这样的印象:我应该使用系统地址作为指向Animal对象的指针,作为New_Animal返回的一部分,或者作为Del_Animal的参数

我所期待的是:
我期望从Ada中清除Ada堆对象。

s3fp2yjn

s3fp2yjn1#

问题出在Del_Animalin out参数及其到C世界的Map上。
您对Del_Animal的意图是它应该像Ada.Unchecked_Deallocation一样工作,换句话说,在调用之后参数被设置为null(或0!),但这意味着您必须传递的是实参的 address
也就是说,

void del_animal(Animal**);

称为

del_animal(&A);

参见ARM B3(68)。

相关问题