我试图从cpp中释放一个已分配的堆Ada标记记录。我使用了代码AdacoreU作为起点。
运行下面的代码时,我会收到以下错误。
20
double free or corruption (out)
raised PROGRAM_ERROR : unhandled signal我是不是想得太多了?我需要一个基于Ada的去分配机制吗。
我真正的最终目标是什么?我想使用动态库来创建一个插件基础设施,其中每个库都是特定类型的自己的工厂。类似于boost dll的东西,但是有基于ada的动态库。
修改后的守则如下:
main.cpp
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
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
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;
~ 用作起点的其他资源
我尝试过什么:
我还指望什么:
我希望从Ada中清除Ada堆对象。
发布于 2022-11-30 22:40:58
问题在于in out参数到Del_Animal及其到C世界的映射。
您使用Del_Animal的意图是它的行为应该像Ada.Unchecked_Deallocation,换句话说,参数被设置为null (或0!)但这意味着您必须传递的是实际地址。
那是,
void del_animal(Animal**);被称为
del_animal(&A);见ARM B3(68)。
https://stackoverflow.com/questions/74609303
复制相似问题