ZAN DoYe wrote on Thu, 23 Aug 2012:
I don't know if it's an undefined behavior or a bug. The environment is fpc 2.6-bugfix branch x86-64 linux. See the details in the attached code
Your code is wrong: you have to assign the result of cm.create to an interface variable instead of to a class instance variable. Created class instances always have a reference count of 0 (both in FPC and in Delphi). Only when assigning them to an interface, their reference count gets increased.
Your "v as ip" expression increases the reference count to 1 since a temporary interface variable is created to hold the result of that expression. After the writeln is finished, that temporary variable disappears and the reference count can go back to zero (that doesn't happen immediately in either FPC or Delphi, but semantically at that point the instance becomes invalid because it could be freed at any time). Once the reference count becomes zero, the associated class instance is freed. Anything that happens afterwards can crash, because the instance is no longer valid.
It doesn't crash in Delphi because the details of when exactly it decreases the reference count of the temporary expression is different than in FPC. That is not something you can count on though.
Jonas _______________________________________________ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-pascal