Gå til innhold

VB 6.0, Eksplisitt ødelegge objekter, noe vits?


Anbefalte innlegg

Jeg har dessverre havnet på forvaltningsgruppa til en eldre applikasjon skrevet i ASP 1.0 og VB 6.0 COM-objekter (yuck :whistle:)

 

Jeg har gravd litt i koden for å bli kjent med makkverket, og ser stadig vekk statements som dette på slutten av prosedyrer:

 

Set myObject = Nothing

 

Etter det jeg vet bruker GC'en i gammel VB reference-counter for å rydde opp gamle objekter og det å sette objektet til 'Nothing' vil, i motsetning til .NET/Java, utløse ødelegging av objektet øyeblikkelig om telleren er 0 etterpå.

 

Men er dette noe vits? Vil ikke referansetelleren gå til 0 automatisk når prosedyren er ferdig og referansen forsvinner ut av scope, slik at GC plukker med seg objektet ved neste anledning?

 

Kan skjønne at det av og til kan være greit å frigjøre ressurser med en gang, men dette er et gammelt transaksjonsbasert system, noe sekunder med et par kB for mye i minnet er ikke akkurat vesentlig.

Endret av MailMan13
Lenke til kommentar
Videoannonse
Annonse

Nå er jeg ganske fersk på 6.0, men hvis det er slik at databasetilkoblinger åpnes når connection-objektet instansieres og lukkes når det destrueres er jo det fornuftig å ikke holde den åpen mens man venter på GC. (er vant med eksplisitte open/close statements for sånt).

 

Nå er det ikke så mange av disse objektene som holder har direkte databasetilkobling, det er pakket inn i en egen DLL. Når jeg ser på koden der ser det ut som tilkoblinger lages og slippes for hvert kall.

 

Men man lager altså ikke noe minnelekasjer eller holder permanent på noen ressurser om man ikke gjør det?

Endret av MailMan13
Lenke til kommentar

Ærlig talt vet jeg ikke, men VB 6.0 bruker COM sitt GC system, som består av en AddRef og en Release funksjon. Release og AddRef er blir kalt når objektet blir referert, og det kan muligens hende da at Release ikke blir kalt hvis ikke man setter referansen lik null.

Men nok en gang, så snakker jeg på grunnlag av troing og synsing, fordi jeg er blitt fortalt at man skal sette objekter lik null i VB6, og jeg har egentlig ikke satt noen spørsmålstegn rundt det.

Lenke til kommentar

Det har alltid vært god skikk å rydde etter seg, også fordi man har full kontroll på hvor lenge objekter lever og hvor. Om det egentlig er noe vits "når mutter'n rydder allikavæl", vel kanskje oftest ikke. Men com-objekter oppfører seg forskjellig, dersom MyObject er Access vil den oppføre seg helt annerledes enn om det er Excel ved terminering. Så du er ikke garantert at GC aldri vil gi deg minnelekkasjer eller pussige bieffekter selv om det oftest går helt greitt. Det er antakelig ikke et makkverk heller hvis det er såpass ryddig programmert.

 

Beste hilsen Harald

Lenke til kommentar

Makkverk er det kanskje ikke i den forstand, men det kan vel kanskje sies at den "har har overlevd sin økonomiske og tekniske levetid" som det heter på fint...

 

Når det går på reference counting er det mamma som tydder uansett, spørsmålet var om det er forskjell på å si ifra at hun skal rydde (ved å redusere telleren til null selv) eller om hun finner ut av det selv (ved å la telleren gå til null når referansen likevel forsvinner) like effektivt.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...