Hej! Tänker du inte på minnesläcka? En vanlig orsak till minnesläcka är att objekt inte frigörs. Vanligare i C++ språk och liknande när man skötter referenser manuellt. Detta kan oxå orsakas av cirkulärreferenser. Om man använder två klasser som refererar till varandra kommer dessa att existera i programmet även om man inte har någon variabel någon annanstans i koden som pekar mot dem. Hej! Nej i VB görs en Set obj = Nothing automatiskt när objektet går 'out of scope'. Alltså när det inte finns några öppna referenser till det längre. Ok! Cirkulärreferens: Det kan ju även vara bra att säga att med de flesta moderna operativsystem så är minnesläckor ganska oväsentliga, eftersom program får virtuellt minne tilldelat, och när programmet avslutas så tas allt virtuellt minne tillbaks av OS-et. Summan är att man igentligen inte behöver fundera på det i VB, om håller på med en mer avancerad programmering.. och är involverad i referenser mellan klasser mm.. Förresten:Vad är en minneslucka?
Jag önskar få en förklaring på hur en minneslucka kan uppstå i ett program och hur man kan hitta dem?
mvh
PhinalaSv: Vad är en minneslucka?
I Vb är det vanligaste minnesläckorna orsakade av andra komponenter och7eller att man inte frigör dem som man ska.Sv: Vad är en minneslucka?
Jo jag menar minnesläcka...
OK! som typ
dim New Obj as Object
set obj =xxx
och sedan så avslutar jag inte object med
set object=nothing
Så då kommer denna att finnas kvar...OCh när jag startar upp programmet, då utamn omstart av datorn, så skapas det en ett tytt obj osv...osv
och metoden blir då att gå igenom alla sina object och se till att de avslutas..
tänker jag rätt
/PhinalaSv: Vad är en minneslucka?
I VB måste du anstränga dig för att generera (egna) minnesläckor.
/johan/Sv: Vad är en minneslucka?
skulle du kunna ge mig ett exempel.. så att pusselbiten hamnar på plats..
/TyronneSv: Vad är en minneslucka?
<code>
'Class: Item
Public Parent As Items
Public Name as String
Public Value as String
'Class: Items
Private mCollection as Collection
Public Function Add(Name as String, Optional Value as string) As Item
Dim NewItem as Item
Set NewItem = Item
Set NewItem.Parent = Me
NewItem.Name = Name
NewItem.Value = Value
mCollection.Add NewItem, Name
Set Add = Name
End Function
Private Sub Class_Initialize()
Set mCollection = New Collection
End Sub
Private Sub Class_Terminate()
Set mCollection = Nothing
End Sub
</code>
Om du lgger till en ITem till Items kommer Items hålla en Referens till Collectionen, Collectionen håller en referens till ditt Item och ditt item håller en referns till Items.
Cirkeln är sluten.
Så om du använder den:
<code>
Dim MyItems as Items
Set MyItems = New Items
MyItems.Add "Nisse", 1
MyItems.Add "Bengt", 2
Set MyItems = Nothing
</code>
Kommer inte Items förstöras även om du sätter den till nothing. Detta eftersom dess Items pekar mot instansen av Items.Sv: Vad är en minneslucka?
Det är alltså under programkörning det kan bli problem., och eventuellt när program inte avslutas ordentligt och det ligger en process kvar, som fortfarande håller minne.
>Vanligare i C++ språk och liknande när man skötter referenser manuellt.
Hmm... i C++ är det inte så vanligt som folk tror. Där lägger man i regel över ansvaret på klasser och kompilatorer. Minneshantering utförd av en klass är normalt sätt så enkel att den inte skapar någon minneläcka. Det är när man behöver minnespooler och de ska utökas chunk-vis som det i några fall blir svårt att hålla reda på minnet.
Det är värre med C och komponenter skrivna i C...Sv: Vad är en minneslucka?
Jag tror jag hajjar detta...
Tack skall ni ha för hjälpen
/PhinalaSv: Vad är en minneslucka?
>Vad är en minneslucka?
Det är det man får när man har druckit en halva vodka för snabbt... =)