🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.pascal
Article #92325

Re: operator -- i dziwny blad

#92325
From: webmajsterek
Date: Tue, 18 Dec 2007 10:13
127 lines
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.pl
References: <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