allgemein
objekt-orientierter entwurf
programmierung
qualitätssicherung / testen

Programiersprache  ObjectPascal (Delphi) 
Schwierigkeitsgrad  mittel 
Eingereicht von  Sascha Frick 
Veröffentlicht am  03.05.2005  
Lösung veröffentlicht am   14.05.2005 

Der bugTeaser

procedure TStrings.Assign(Source: TPersistent);
begin
  if Source is TStrings then
  begin
    BeginUpdate;
    try
      Clear;
      AddStrings(TStrings(Source));
    finally
      EndUpdate;
    end;
    Exit;
  end;
  inherited Assign(Source);
end;

Anmerkungen

Das Codefragment stammt aus der Klassen-Bibliothek von Delphi:
Bei TStrings handelt es sich um eine Listenklasse zur Verwaltung von Zeichenketten. Die Delphi-Hilfe sagt zu TStrings.Assign folgendes:

Mit der Methode Assign lassen sich der String-Liste die Strings eines anderen Objekts zuweisen. Die Zuweisung umfaßt auch eventuell vorhandene Objekt-Referenzen dieser Strings.

Mit der Methode Assign wird einem TStrings-Objekt der Wert eines anderen Objekts zugewiesen. Ist das Quell-Objekt ebenfalls vom Typ TStrings, enthalten beide Objekte anschließend die gleiche Liste. Falls den String-Werten der Quelle Objekte zugeordnet sind, werden auch diese übernommen, wenn das Zielobjekt diese Eigenschaft unterstützt.

Wenn das mit dem Parameter Source bezeichnete Quellobjekt nicht vom Typ TStrings ist, übernimmt die geerbte Assign-Methode den Listenwert von einem beliebigen anderen Objekt, das in seiner AssignTo-Methode die Klasse TStrings unterstützt.

Die Methode macht eigentlich alles richtig, ausser in einem ganz bestimmten Fall, der jedem C++ Programmierer geläufig sein dürfte...

Über diesen bugTeaser diskutieren.



#007: Das verlorene Ergebnis #005: Die entflohene Referenz

Druckbare Version