Toon posts:

Destructing in C# vs C++

Pagina: 1
Acties:

Verwijderd

Topicstarter
Heb in C++ de volgende code:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class A
{
public :
   double x,y,z;
};

class B
{
public :
   int k,l,m;
   A p;
} 

B::B()
{
   p = new A;
}

B::~B()
{
   delete p;
}

Main()
{
   c = new B;
   delete c;
}



In de main wordt bij delete c ook de delete van p aangeroepen, ik weet zeker dat het geheugen gealloceerd bij p = new A ook weer vrijgegeven is.


Hoe krijg ik hetzelfde voor elkaar in C#? Waarbij de vraag zich denk ik richt op wat wordt ~B(), immers:

C#:
1
2
3
4
B::~B()
{
   delete p;
}


kan niet in C#.

Ik heb al eea gelezen over finalize, gc, dispose, zetten van p=null... maar kan hier nog niet zo wijs uit worden. Wat is nu een goede manier om dit voor elkaar te krijgen?

[ Voor 3% gewijzigd door Verwijderd op 30-01-2005 07:53 ]


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

c# heeft een garbage collector :)

  • zneek
  • Registratie: Augustus 2001
  • Laatst online: 08-02-2025
Oftewel p = null is voldoende (mits er niet ergens anders in je code ook nog references naar p zijn)

[edit] Als p null is, is de reference naar het betreffende object weg. De garbage collector zal in zijn volgende run het door het object gebruikte geheugen opruimen.

[ Voor 30% gewijzigd door zneek op 29-01-2005 15:43 ]


  • Orphix
  • Registratie: Februari 2000
  • Niet online
Waarbij opgemerkt moet worden dat je in C# itt C++ nooit zeker weet wanneer je object wordt opgeruimd. En dus ook niet wanneer je destructor wordt aangeroepen. Als je resources gebruikt in een object die je weer wilt vrijgeven wanneer je object niet meer gebruikt wordt dan kan je beter de IDisposable interface toepassen.

  • whoami
  • Registratie: December 2000
  • Laatst online: 16-05 10:09
C# heeft wel een GC, maar dan nog ben je niet zeker wanneer precies dat geheugen vrijgegeven wordt (maw, je weet niet wanneer die GC in werking zal treden).

https://fgheysels.github.io/


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

whoami schreef op zaterdag 29 januari 2005 @ 17:29:
C# heeft wel een GC, maar dan nog ben je niet zeker wanneer precies dat geheugen vrijgegeven wordt (maw, je weet niet wanneer die GC in werking zal treden).
Kun je wel forceren met GC.Collect(), desnoods met een specificatie tot welke 'ring' opgeruimd dient te worden ;)

Desalnietteplus is dat geen good practice :)

Professionele website nodig?


  • whoami
  • Registratie: December 2000
  • Laatst online: 16-05 10:09
curry684 schreef op zaterdag 29 januari 2005 @ 17:35:
[...]

Kun je wel forceren met GC.Collect(), desnoods met een specificatie tot welke 'ring' opgeruimd dient te worden ;)
Indeed.
Desalnietteplus is dat geen good practice :)
Ook weer waar.

https://fgheysels.github.io/


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 18:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

Zet code tussen [code=taal]...[/code] tags zodat de formatting blijft behouden. Bovendien worden talen als C++ en C# gehighlight :). Daarnaast is dit geen valide C++ code, om talloze redenen. Heb je het 1:1 overgenomen of gewoon even snel een voorbeeldje getikt?
Hoe krijg ik hetzelfde voor elkaar in C#? Waarbij de vraag zich denk ik richt op wat wordt ~B(), immers:

B::~B()
{
delete p;
}

kan niet in C#.
Hoeft ook niet. B wordt opgeruimd, dus alles waar B een referentie naar heeft kan evt. ook opgeruimd worden. Als er verder geen referentie meer is naar die p dan zal ie net zo goed opgeruimd worden.

Overigens krijg je in .Net 2.0 wel determistic finalization, dus ook destructors die worden aangeroepen als een lokale variabele bijvoorbeeld uit scope gaat.

[ Voor 10% gewijzigd door .oisyn op 29-01-2005 19:36 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

.oisyn schreef op zaterdag 29 januari 2005 @ 19:36:
[...]

Overigens krijg je in .Net 2.0 wel determistic finalization, dus ook destructors die worden aangeroepen als een lokale variabele bijvoorbeeld uit scope gaat.
Bron? Dat heb ik namelijk compleet gemist en heb ik voor C# wel extreme interesse in :)

Professionele website nodig?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 18:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

Gemist? Dat is na generics zo'n beetje hét nieuwe item van .Net 2.0 :P
Ik heb er een hoop online presentaties over gevolgd, maar ik kan je zo 1,2,3 geen link geven. Vraag anders eens aan Yarvieh @ IRC. Google zegt er ook niet veel over idd.

.edit: ik kan me nog een stukje herinneren dat ze het zo onlogisch is gebleken dat je in C# finalizers definieert op de manier waarop je in C++ destructors definieert (met een ~ voor de class naam als method). De syntax werd geloof ik aangepast, !ClassName wordt een finalizer en een ~ClassName wordt een echte destructor.

[ Voor 41% gewijzigd door .oisyn op 30-01-2005 00:09 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
.oisyn schreef op zaterdag 29 januari 2005 @ 19:36:
[...]
Daarnaast is dit geen valide C++ code, om talloze redenen. Heb je het 1:1 overgenomen of gewoon even snel een voorbeeldje getikt?
[...]
Is uiteraard maar een snel voorbeeldje.

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 15-05 14:44

_Thanatos_

Ja, en kaal

Oftewel p = null is voldoende (mits er niet ergens anders in je code ook nog references naar p zijn)
"p = null;" hoeft nog niet eens. Als een variabele out of scope raakt, dan weet de garbage collector dat al. Em op null zetten helpt alleen maar als de variabele globaler is, en je wilt van het object af. Anders is het totaal nutteloos, omdat de GC niet z'n ding al gaat doen als jij één dingetje vrijgeeft ;)

日本!🎌


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
.oisyn schreef op zondag 30 januari 2005 @ 00:07:
Gemist? Dat is na generics zo'n beetje hét nieuwe item van .Net 2.0 :P
Ik heb er een hoop online presentaties over gevolgd, maar ik kan je zo 1,2,3 geen link geven. Vraag anders eens aan Yarvieh @ IRC. Google zegt er ook niet veel over idd.

.edit: ik kan me nog een stukje herinneren dat ze het zo onlogisch is gebleken dat je in C# finalizers definieert op de manier waarop je in C++ destructors definieert (met een ~ voor de class naam als method). De syntax werd geloof ik aangepast, !ClassName wordt een finalizer en een ~ClassName wordt een echte destructor.
Nope, dat was Managed C++ versus C++/CLI waar je aan denkt.

Uit m'n hoofd is de C++ dtor onder water een implementatie van IFinalize, en de C# notatie daarvoor is "using (X) { /*code die X used */ } "

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1