ID3DXFont::AddRef jak kopiować

0

Hej
Aby stworzyć instancę ID3DXFont należy zadeklarować wskaźnik:
ID3DXFont *wsk = NULL;
i potem do pewne funckji D3DXCreateFont przekazać adres wskaźnika &wsk.
Pamięć zwalania się metodą:
wsk->Release().

Pytanie:
Jak skopiować instancję bym miał 2 niezależne instance czy tak jak niżej jest OK czy jeszcze jakoś inaczej???

ID3DXFont* wsk2 = wsk;
wsk->AddRef(); //bądź wsk2->AddRef() obojętnie

Ja szczerze mówiąc nigdy nie potrafiłem zrozumieć jak działa AddRef, bo przecież jak potem robię wsk->Release() to skąd wiadomo czy zwalniamy instancę przypisaną do wsk2 czy wsk, czy to jakoś od tyłu idzie. No i dobre tez pytanie jest co się dzieje jak mój ID3DXFont *wsk jest elementem struktury która alokuję dynamicznie i robię delete wskaźnika na tą strukturę. To wtedy obie instancje giną?

0

Własnie sprawdziłem w praktyce i jednak to powyżej nie tworzy mi 2 niezależnych instancji. Modyfikacja koloru/wymarów kontekstu dla jednej z nich modyfikuje kolor/wymiary kontekstu(czyli bitmapy po której rysujemy) również dla drugiej.

0

no a jak ma robić drugą instancję, skoro w zasadzie kopiujesz wskaźnik:

ID3DXFont* wsk2 = wsk;

A metody AddRef() i Release() służą do zliczania referencji i działają tak:
AddRef zwiększa licznik o 1, a Release zmniejsza o 1. Jeśli licznik zejdzie do 0, obiekt jest zwalniany. Ponieważ początkowa wartość licznika wynosi 1, standardowo (bez AddRef) obiekt jest usuwany przy pierwszym Release. Dwukrotne wywołanie AddRef spowoduje konieczność trzykrotnego wywołania Release.

0

OK, rozumiem, czyli jak dam AddRef() i potem Release() to i tak dalej mogę używać wskaźnika, bo instancja dalej istnieje. Spoko. Dzięki. Dalej jest aktywne moje pytanie jak utworzyć drugą instancję bazującą na pierwszej tak by były niezależne, coś czuję że się nie da dla takich obiektów których instancje powstają poprzez wywołanie metody ich klasy i przekazanie tam adresu wskaźnika.

0

Nie wiem czy jest możliwość, a nie możesz jeszcze raz wywołać D3DXCreateFont z tymi samymi parametrami?

Zwróć uwagę, że jest jeszcze D3DXCreateFontIndirect, które możesz połączyć z ID3DXFont::GetDesc i masz właściwie to co chciałeś.

To odpowiadam po kilkuminutowym przejrzeniu dokumentacji, nie mając wcześniej żadnej wiedzy na temat tej klasy.
Polecam czytanie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1