Article View: pl.comp.lang.pascal
Article #92325Re: operator -- i dziwny blad
From: webmajsterek
Date: Tue, 18 Dec 2007 10:13
Date: Tue, 18 Dec 2007 10:13
127 lines
4710 bytes
4710 bytes
> > operator :=(A:Test):String;
> > begin
> > Result := A.NumberToDexString;
> > end;
>
> > Memo.lines.Add('laczoney lancuch'+T+' ..');//zonk
>
> > jak myslicie to blad kompilatora czy moj ??
>
>
> Twój. w zapisie 'laczoney lancuch'+T+' ..' nie ma zastosowania operator :=
> tylko +
no wlasnie o to chodzi ze ten operator tam ma zastosowanie !!!
wogle nei przeciazylem operatora + .
robie taki test
Memo.Lines.Add( 'N.Dexstring test '+N.DexString+' test koniec');//oki
Memo.Lines.Add( 'String(N) test '+String(N)+' test koniec');//oki
Memo.Lines.Add( 'N test '+N+' test koniec');//zonk Acces volation
a wiec jak tma ma zastosowanie operator + to wogle nie powinno sie skompilowac
. wedlug mnie jest blad w kodzie ( pascala ) ktory przepisuje dane ze stringa .
mzoe tam gdzies jest po drodze niejawna konwersja na AnsiString
> Aha, i bardzo ważne: robisz operatory na klasach, więc pamiętaj o pułapce:
> wystrzegaj się operatorów, które zwracają obiekt klasy, np:
>
> -----------
> operator +(a:test;b:test):test; // klasa jako wynik - niebezpieczne
> begin
> ...
> end;
> -----------
>
> taki operator musiałby tworzyć {poprzez .create()} swój wynik:
>
> -----------
> operator +(a:test;b:test):test;
> begin
> result.create;
> ...
> end;
> -----------
>
> i testujemy:
>
>
> -----------
> var a,b,c:test;
>
> a:=test.create;
> b:=test.create;
> c:=a+b;
> {...}
> a.free;
> b.free;
> c.free;
> -----------
>
> wewnątrz dodawania mamy niejawny konstruktor obiektu c. ALE:
>
>
> -----------
> var a,b,c,d:test;
>
> a:=test.create;
> b:=test.create;
> c:=test.create;
> d:=a+b+c;
> {...}
> -----------
>
> i? i wszystko niby ok, tylko że podczas wykonywania działania utworzono
> tymczasowy obiekt z wynikiem (a+b). Następnie kolejny z wynikiem (a+b)+c, i
> ten właśnie jest zwracany jako d. A tamten pośredni? zgubiliśmy - powstał,
> nigdy nie został zniszczony i zniszczony być nie już może, bo nie mamy na
> niego żadnego wskaźnika. Mamy wyciek w pamięci - a gdyby taki kod (albo
> mniej oczywisty, ale z tym samym efektem) pojawił się np. w pętli
> wykonującej się 1000 razy na sekundę, posypanie programu gotowe.
>
> Dlatego nie wolno pisać operatorów, w których tworzony jest jakikolwiek
> obiekt klasy - bo nie będzie mógł być zniszczony.
> Oznacza to, że odpadają operatory zwracające "class", co nas dość mocno
> ogranicza. Ale możemy:
>
> - dowoli używać operatorów w przypadku tablic i rekordów (oczywiście jeżeli
> nie zawierają klas w sobie)
> - dowoli używać operatorów w przypadku obiektów typu "object" (zamiast
> "class"). są one przekazywane przez wartość (jak rekordy) i efekt wycieku
> pamięci nie wystąpi, ale "object" nie obsługują właściwości (property).
> - jeżeli już koniecznie potrzebujesz klasy typu "class", to musisz utworzyć
> dodatkowy typ interfejsowy (interface), a klasę dziedziczyć po
> TIterfacedObject. Da ci to automagiczne wywoływanie destruktora na takim
> tymczasowym obiekcie, jak wyżej opisałem. Jeśli chcesz szczegółów, służę
> pomocą ;-)
>
no wlasnie ja probuje uzywac tych operator tak jak ty zabraniasz
robie tak
operator +(var A,B:JakisObjekt):JakisObject;
begin
Result:=A;
Result.Sum(B);
end;
i wtedy mam przeciazenie typu
Wynik+=dane;
i nie zachodzii wyciek pamieci .
zreszta ja w tym obiecie uzywam dynamicznej tablicy ze wskaznikem na nia --
wiec jakiekieolwiek odwolanie sie do nieistniejacego obiektu powoduje
AccesVolation -- i wiem ze cosik nie gra .
a jak mozesz to daj przyklad z interfejsem -- bo nie jak nie moge tego zrozumiec .
--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
Technical Details
Message-ID:
<3b2e.0000004f.47679d3c@newsgate.onet.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.onet.pl!newsgate.onet.pl!niusy.onet.plReferences:
<fk4dhi$odd$1@news.onet.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.onet.pl!newsgate.onet.pl!niusy.onet.pl From: webmajsterek@poczta.onet.pl Newsgroups: pl.comp.lang.pascal Subject: Re: operator -- i dziwny blad Date: 18 Dec 2007 11:13:17 +0100 Organization: Onet.pl SA Lines: 127 Message-ID: <3b2e.0000004f.47679d3c@newsgate.onet.pl> References: <fk4dhi$odd$1@news.onet.pl> NNTP-Posting-Host: newsgate.onet.pl Mime-Version: 1.0 X-Trace: newsgate.test.onet.pl 1197972797 8557 213.180.130.18 (18 Dec 2007 10:13:17 GMT) X-Complaints-To: abuse@onet.pl NNTP-Posting-Date: 18 Dec 2007 10:13:17 GMT X-Mailer: http://niusy.onet.pl X-Forwarded-For: 79.184.48.32, 192.168.243.43 X-User-Agent: Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8.1.10) Gecko/20071202 Firefox/2.0.0.10 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit