首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从CPP释放Ada记录

如何从CPP释放Ada记录
EN

Stack Overflow用户
提问于 2022-11-29 04:53:10
回答 1查看 75关注 0票数 1

我试图从cpp中释放一个已分配的堆Ada标记记录。我使用了代码AdacoreU作为起点。

运行下面的代码时,我会收到以下错误。

代码语言:javascript
复制
20
double free or corruption (out)

raised PROGRAM_ERROR : unhandled signal

我是不是想得太多了?我需要一个基于Ada的去分配机制吗。

我真正的最终目标是什么?我想使用动态库来创建一个插件基础设施,其中每个库都是特定类型的自己的工厂。类似于boost dll的东西,但是有基于ada的动态库。

修改后的守则如下:

main.cpp

代码语言:javascript
复制
  1 #include <iostream>
  2 #include "animal.h"
  3 
  4 extern "C" {
  5     void adainit (void);
  6     void adafinal (void);
  7     Animal* new_animal();
  8     void del_animal(Animal *);
  9 }
 10 
 11 int main(void) {
 12     adainit();
 13     Animal* A = new_animal();
 14     std::cout << A->age() << std::endl;
 15     //delete A;   
 16     del_animal(A);
 17     adafinal();
 18     return 0;
 19 };

alib.ads

代码语言:javascript
复制
  1 
  2 with Interfaces.C;
  3 
  4 package ALib is
  5 
  6     type Animal is tagged record
  7         The_Age : Interfaces.C.int;
  8     end record;
  9     pragma Convention (CPP, Animal);
 10 
 11     type Animal_Class_Access is access Animal'Class;
 12 
 13     function New_Animal return access Animal'Class;
 14     pragma Export(CPP, New_Animal);
 15 
 16     procedure Del_Animal (this : in out Animal_Class_Access);
 17     pragma Export(CPP, Del_Animal);
 18 
 19     function Age(X : Animal) return Interfaces.C.int;
 20     pragma Export(CPP, Age);
 21 
 22 end ALib;

alib.adb

代码语言:javascript
复制
  1 with ada.unchecked_deallocation;
  2 
  3 package body ALib is
  4 
  5     function New_Animal
  6         return access Animal'Class is
  7     begin
  8         return new Animal'(The_Age => 20);
  9     end New_Animal;
 10 
 11 
 12     procedure Del_Animal (this : in out Animal_Class_Access) is
 13         procedure Free is new ada.unchecked_deallocation(Animal'Class, Animal_Class_Access);
 14     begin
 15         Free(this);
 16         --null;
 17     end Del_Animal;
 18 
 19     function Age(X : Animal)
 20         return Interfaces.C.int is
 21     begin
 22         return X.The_Age;
 23     end Age;
 24 
 25 end ALib;
~              

用作起点的其他资源

3.11.3.5在类级与C++接口

我尝试过什么:

  • 在尝试创建空闲过程时,使用类型和访问类型的各种组合
    • 动物,Animal_Access类型是访问动物
    • 动物类,类型Animal_Class_Access是访问动物类
    • 动物,Animal_Access类型是访问动物类

  • 在某种程度上,我的印象是,我应该使用系统地址作为指向动物对象的指针,作为New_Animal返回的一部分和Del_Animal的参数。

我还指望什么:

我希望从Ada中清除Ada堆对象。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-30 22:40:58

问题在于in out参数到Del_Animal及其到C世界的映射。

您使用Del_Animal的意图是它的行为应该像Ada.Unchecked_Deallocation,换句话说,参数被设置为null (或0!)但这意味着您必须传递的是实际地址。

那是,

代码语言:javascript
复制
void del_animal(Animal**);

被称为

代码语言:javascript
复制
del_animal(&A);

ARM B3(68)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74609303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档