2012-11-16 16 views
7

Używam ComPtr (Microsoft :: WRL) do zarządzania niektórymi zasobami DirectX11. Jak mogę ręcznie zwolnić?Ręczne wydanie ComPtr

Metoda "ReleaseAndGetAddressOf", jeśli rozumiem poprawnie, zwalnia tylko wskaźnik, a nie sam zasób (który jest zwracany) i nie jestem pewien co do metody "Resetuj".

Jedyne alternatywy, jakie mogłem wymyślić, to ręczne wywoływanie wskaźnika destruktora lub po uzyskaniu surowego wskaźnika z "ReleaseAndGetAddressOf" wywołującego na nim "Release", którego chciałbym uniknąć.

+0

Twój opis funkcji ReleaseAndGetAddressOf() jest niepoprawny. Zwolnienie zasobu powoduje zwrócenie adresu owiniętego wskaźnika, w którym można zapisać inną wartość wskaźnika. "Calling Release on that" powinno być napisane "Calling Release na zwisającym wskaźniku, aby zawiesić mój program". –

Odpowiedz

16

Podano kod źródłowy WRL, spójrz na include/winrt/wrl/client.h. Wbudowany wskaźnik COM (ptr_ member) jest zwalniany przez funkcję InternalRelease(). Wykonanie jednego z poniższych sposobów zwolnienia wskaźnika odpowiednich kandydatów:

  • destruktor. Powodem korzystania ComPtr <>
  • przypisywania nullptr
  • użyciu ReleaseAndGetAddressOf(), długa droga wokół
  • nazywając reset()

więc przypisywanie nullptr lub dzwoniąc reset() są dobrym rozwiązaniem, wybierz. Lub nie używaj go w ogóle, jeśli chcesz samodzielnie zarządzać wskaźnikiem interfejsu, to z pewnością nie jest wymagane używanie ComPtr.

+0

Dziękuję za szczegółowe wyjaśnienie. Rzeczywiście czerpię korzyści z używania inteligentnego wskaźnika, ale w niektórych przypadkach muszę wyładować wewnętrzny zasób zachowując klasę opakowania. –

+0

ReleaseAndGetAddressOf() -> Release() nawet nie kompilują. (* instance.ReleaseAndGetAddressOf()) -> Release() jest awarią. Usuń go z odpowiedzi. –

3

Możesz przypisać zerowy wskaźnik.

+0

Dziękuję, tak łatwe, jak mogłem mieć nadzieję! –