【问题标题】:Symbol eliminated by linker [closed]链接器消除的符号[关闭]
【发布时间】:2014-03-25 18:51:05
【问题描述】:
Shape_class=class(tobject)

  Constructor create;
  Destructor Demolish;

Public
  Shape:tshape;
  Shape_width,
  Shape_height,
  Shape_left,
  Shape_top:integer;
End;

Function add_shape
  :Shape_class;
Begin
  Result:=shape_class.create;
End;

代码已简化,但说明了我的代码中发生的情况。调试器会忽略对构造函数的调用。如果我将指针悬停在调用中的 class_name 标识符上,则提示会通知我“链接器消除的符号”。

我不知道是什么原因造成的。我想知道它是否与堆栈的大小有关,但是增加堆栈没有区别。

【问题讨论】:

  • 请添加SSCCE
  • 如果有任何有价值的答案可以接受,请检查您的旧问题。
  • 顺便说一句,您的Demolish 析构函数永远不会使用Free 调用。析构函数应该声明为destructor Destroy; override;
  • -1 您提供了不完整的代码,而提供完整的程序很容易。关于细节的编程。
  • 令人惊讶的是,您不会提供 SSCCE。如果你这样做了,我们可以回答。不,当您调用 Free 时,不会调用 Demolish。免费通话销毁。在 TObject 中声明的虚拟 Destroy。很多人都告诉过你。如果您认为我们都是无知和错误的,那您可能是在浪费时间向我们提问。

标签: class delphi linker delphi-7 debug-symbols


【解决方案1】:

这是一个自我毁灭的答案(因为它只是一个长评论)

如果没有SSCCE,您的问题将无法回答

我构建了一个小型控制台应用程序来测试您的代码,如目前所示

program so_21982168;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  SysUtils;

type
  Shape_class = class( tobject )

    Constructor create;
    Destructor Demolish;

  Public
    Shape : tobject;
    Shape_width, Shape_height, Shape_left, Shape_top : integer;
  End;

Function add_shape : Shape_class;
Begin
  Result := Shape_class.create;
End;

{ Shape_class }

Constructor Shape_class.create;
Begin
  Writeln( 'shape_class.create called' );
  Shape := tobject.create;
End;

Destructor Shape_class.Demolish;
Begin
  Writeln( 'shape_class.Demolish called' );
  Shape.Free;
End;

procedure Test;
var
  LInstance : Shape_class;
Begin
  Writeln( 'Test ENTER' );
  LInstance := Shape_class.create;
  try
    Assert( Assigned( LInstance ) );
  finally
    LInstance.Free;
  End;
  Writeln( 'Test LEAVE' );
End;

Begin
  try

    Test;

  except
    on E : Exception do
      Writeln( E.ClassName, ': ', E.Message );
  End;

  Readln;

End.

输出是

测试 ENTER shape_class.create 调用 测试离开
  • destructor Demolish不是Free调用
  • 存在内存泄漏Shape 实例将不会被释放)
  • 根本没有没有提示

【讨论】:

  • 首先我要道歉。是的,您对析构函数是正确的,现在知道这一点肯定会在以后有所帮助。此外,我通过简化 p_class_pointer(generic_pointer):=@class_name.create; 中的代码来解决我的问题。 to class_instance:=class_name.create; p_class_pointer(generic_pointer):=@class_instance;它有效! TIA 安德鲁
  • @Muscipula 这正是您发布假代码时发生的情况。问题中没有出现p_class_pointer(generic_pointer):=@class_name.create。 FWIW,p_class_pointer(generic_pointer) 极不可能成为任何问题的解决方案。你征求意见,然后忽略它。很多次你都被告知过你的析构函数,但你一直无视这些建议。你有很多东西要学,除非你认识到自己缺乏知识并且需要学习,否则你将无法学习。希望你能调整一下心态。
  • @Muscipula 如果您编辑您的问题并在此处添加您评论中的信息,我们可以重新打开问题,我想所有的反对票都会消失
  • FWIW,你应该写的是generic_pointer:=Pointer(class_name.create),然后你可以通过class_name(generic_pointer).--p_class_pointer(@generic_pointer).--访问你的班级
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-16
  • 2013-07-11
  • 2019-05-27
  • 2016-10-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多