PROGRAM_ERROR由受控类型引发,很难确定它在我的代码中完全引发的位置?

时间:2018-04-01 22:42:23

标签: ada

我使用John English:Ada95: The Craft of Object-Oriented Programming作为教程,我目前正在使用表达式计算器章节。这意味着用面向对象的方法编写算术表达式计算器 该程序编译但提出:

mehdi@debian ~/expressions> ./driver
Execution terminated by unhandled exception
raised PROGRAM_ERROR : expressions.adb:4 finalize/adjust raised exception
Call stack traceback locations:
0x408749 0x408aa4 0x401af6 0x4024ee 0x7f05fe7132df 0x401988 0xfffffffffffffffe

从那些有趣的数字我只能提取这些信息:

addr2line --exe=driver 0x408749 0x408aa4 0x401af6 0x4024ee 0x7f690a2b32df 0x401988 0xfffffffffffffffe
/home/mehdi/expressions/pointers.adb:40 (discriminator 6)
/home/mehdi/expressions/expressions.adb:17
/home/mehdi/expressions/driver.adb:8
/home/mehdi/expressions/b__driver.adb:267
??:0
??:?
??:0

上述行,一个接一个:

   overriding procedure Adjust (Object: in out Smart_Pointers) is
   begin
       Object.Node.Count := Object.Node.Count + 1;
   end Adjust; -- here FIRST ONE
   end Evaluate; -- SECOND
   Put_Line("Le résultat de 598-8/84+25*5*(-5/54) est " & EVALUATE(Expression, Expression_string)'Img); -- THIRD
   Ada_Main_Program; -- FOURTH

我仍然没有任何线索,只是它与受控类型有关 我放的唯一受控制的东西,我在这里列出。
哦,还有FINALIZE:

 overriding procedure Finalize (Object: in out Smart_Pointers) is
      procedure Free is new Ada.Unchecked_Deallocation(Accessor_type, Accessor_access);
   begin
      Object.Node.Count := Object.node.Count - 1;
      if Object.Node.Count = 0 then Free(Object.Node);
      end if;
   end;

但似乎并不重要。

我是初学者,所以我还没有如何使用gdb或GPS的调试工具 如果有人有想法,或需要更大的代码,请让自己知道; - )

3 个答案:

答案 0 :(得分:6)

AdjustFinalize引发异常是一个有限的错误。如果发生这种情况,运行时将引发PROGRAM_ERROR。在Adjust中,有两种可能会引发异常:

  1. Object.Nodenull
  2. Object.Node.Count可以在其类型
  3. 的范围之外递增

    如果您不想使用调试器,可以向AdjustFinalize添加例外处理程序。

答案 1 :(得分:2)

如你所说,Adjust必须处理复制空智能指针。

我在ARM中没有看到它,但Finalize可以在同一个对象上多次调用,所以你必须满足它。

My smart pointer code

--  Finalize may be called more than once on the same object.
--
--  The first time its called, we may set Tmp to a non-null value
--  which designates the actual shared object and then proceed to
--  decrement the count and, if no references remain, delete the
--  used memory. But, in any case, *this* smart pointer no longer
--  references the actual object, so another call to Finalize will
--  have no effect.
procedure Finalize (Obj : in out Pointer) is
   Tmp : Ref := Obj.Rep;
begin
   Obj.Rep := null;
   if Tmp /= null then
      Tmp.Count := Tmp.Count - 1;
      if Tmp.Count = 0 then
         Delete (Tmp.Value);
         Delete (Tmp);
      end if;
   end if;
end Finalize;

答案 2 :(得分:0)

根据建议here,它是Object.Node is null