代码之家  ›  专栏  ›  技术社区  ›  jpfollenius Rob Kennedy

管柱过早损坏以及如何避免?

  •  1
  • jpfollenius Rob Kennedy  · 技术社区  · 16 年前

    我正在使用Delphi 2009,并使用以下代码段得到一些奇怪的错误:

    var
      Str     : AnsiString;
      CharPtr : PAnsiChar;
    ...
    CharPtr := PAnsiChar (Str);
    ExecuteInBackgroundThread (
      procedure
      begin
      DoSomething (CharPtr);
      end);
    

    第二个问题是:如何绕过被破坏的字符串?正确的方法是什么?

    提前谢谢。

    4 回复  |  直到 16 年前
        1
  •  7
  •   Wim Coenen    16 年前

    所以第一个问题是:我说的对吗?

    很可能是的。Delphi的应答是引用计数的。什么时候 Str

    第二个问题是:我该怎么做 绕过正在使用的字符串 破坏?正确的方法是什么 这个?

    通过不使用指针,如下所示:

    var
      Str     : AnsiString;
    ...
    ExecuteInBackgroundThread (
      procedure
      begin
      DoSomething (Str);
      end);
    
        2
  •  4
  •   Alex    16 年前

    只需使用:

    DoSomething(PAnsiChar(Str));
    

    一般规则很简单: 直到最后一刻才使用PChar . 这样,您就不需要过多地考虑内存管理问题(嗯,大多数情况下)。

    另见 this great article .

        3
  •  2
  •   jpfollenius Rob Kennedy    16 年前

    好吧,我想我可能已经弄明白了。

    我使用的是匿名方法,因此编译器应该捕获我的局部变量。显然,它只捕获我在匿名方法中实际使用的变量。这意味着CharPtr被捕获,而不是SendStr。所以,当SendStr超出范围时,它将被销毁,CharPtr现在有指向一些随机垃圾的危险。

    经过以下修改

    ExecuteInBackgroundThread (
      procedure
      begin
      Log (Str);
      DoSomething (CharPtr);
      end);
    

    一切似乎都很好。

        4
  •  0
  •   Preet Sangha    16 年前

    为什么不按值传递字符串,而不是指针/引用?