[C++/CLI] Waar dient ^ voor?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • GambitRS
  • Registratie: Juni 2001
  • Laatst online: 13-06-2013
Ik weet dat dit een noobie vraag is, maar ik stel hem toch maar. Ik kan hem namelijk niet oplossen dmv een search, tot mijn grote frustratie

Ik startte net Visual C++ 2008 op en ik zie de volgende constructie staan:
System::String ^

Nou weet ik wel wat een String is, maar waar staat nou die ^ voor?

MechWarrior || Monsters Game


Acties:
  • 0 Henk 'm!

  • MLM
  • Registratie: Juli 2004
  • Laatst online: 12-03-2023

MLM

aka Zolo

managed pointer (als in, een native pointer is *)

Je gebruikt dat type pointer om naar een managed (.NET framework objecten bijvoorbeeld) object te verwijzen. Deze objecten staan dan ook op de managed heap ;)

[ Voor 62% gewijzigd door MLM op 17-12-2008 20:10 ]

-niks-


Acties:
  • 0 Henk 'm!

  • GambitRS
  • Registratie: Juni 2001
  • Laatst online: 13-06-2013
ah! en wat is het verschil tussen een managed en een native pointer?

MechWarrior || Monsters Game


Acties:
  • 0 Henk 'm!

  • MLM
  • Registratie: Juli 2004
  • Laatst online: 12-03-2023

MLM

aka Zolo

Managed pointer word beheerd door de CLR (memory management etc). Lees je in op MSDN, alle informatie die je zoekt vind je daar wel ;)

Kijk bijvoorbeeld hier: http://msdn.microsoft.com/en-us/library/te3ecsc8.aspx

[ Voor 23% gewijzigd door MLM op 17-12-2008 20:19 ]

-niks-


Acties:
  • 0 Henk 'm!

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

De ene is onderhevig aan garbage collection, de andere niet...

Ik vraag me wel af of je de term managed pointer zomaar mag vervangen door reference?

ASSUME makes an ASS out of U and ME


Acties:
  • 0 Henk 'm!

  • MLM
  • Registratie: Juli 2004
  • Laatst online: 12-03-2023

MLM

aka Zolo

Mja, managed pointer is ook niet helemaal correct, officieel heet het een handle. (Omdat een managed object geen vast adres heeft, kan je er niet naar pointen natuurlijk). Desondanks, ze gedragen zich ongeveer hetzelfde, alleen hoef je een handle dus niet op te ruimen, dat gebeurd vanzelf.

-niks-


Acties:
  • 0 Henk 'm!

Verwijderd

Ik vraag me wel af of je de term managed pointer zomaar mag vervangen door reference?
Je gebruikt dat type pointer om naar een managed (.NET framework objecten bijvoorbeeld) object te verwijzen. Deze objecten staan dan ook op de managed heap
Dat doet me denken van wel, maar komt er gelijk een vraag bij mij naar boven:
Waarom een managed pointer als je toch nog expliciet met pointers aan de gang gaat. Ruimt de GC niet automatisch de 'troep' waarnaar geen pointers meer verwijzen? Zo niet, waarom is het dan überhaupt een managed pointer en niet gewoon een '*'?

Acties:
  • 0 Henk 'm!

  • MLM
  • Registratie: Juli 2004
  • Laatst online: 12-03-2023

MLM

aka Zolo

De GC ruimt inderdaad objecten op de managed heap op. De ^ bestaat omdat het hebben van een * naar een managed object niet zomaar kan, dat object moet dan "fixed" worden (het mag niet meer van geheugenplaats veranderen). Tenzij je expliciet een * nodig hebt kan je dan ook beter een ^ gebruiken in je code...

-niks-


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:28

.oisyn

Moderator Devschuur®

Demotivational Speaker

Sowieso gaat dit om C++/CLI, niet om C++. Dat lijkt flauw, maar het is toch echt een andere taal. Je kunt met VC++ 2008 echter nog wel gewoon C++ programmeren, moet je een project met het juiste projecttype aanmaken (een win32 project).

Ter aanvulling op de laatste post van MLM, het verschil tussen ^ en * is er omdat je in hetzelfde programma zowel CLR handles als native pointers kunt gebruiken. "Vroegâh", in Managed C++ (VS 2002 en 2003), werd de * notatie voor beide constructs gebruikt, wat alleen maar verwarring en ambiguïteiten met zich meebracht, waardoor ze voor C++/CLI een fatsoenlijke oplossing hebben bedacht. Naast de ^ heb je trouwens ook de %, de CLR variant van de & (voor references en het verkreigen van adressen van references)

C++:
1
2
3
4
5
6
7
8
int main()
{
    int * intptr = new int;
    int & intref = *intptr;

    int ^ inthandle = gcnew int;
    int % intref2 = ^inthandle;
}

[ Voor 37% gewijzigd door .oisyn op 17-12-2008 20:59 ]

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.

Pagina: 1