Утечка памяти при загрузке 2D текстуры с DX11 - PullRequest
0 голосов
/ 04 апреля 2019

При загрузке текстуры без особых проблем, ID3D11Texture2D, которую я использую для временного захвата информации D3D11_TEXTURE2D_DESC, похоже, не удаляется должным образом.

Если я не буду использовать элемент ID3D11Texture2D, я не будуутечки памяти.Когда я его использую, несмотря на то, что удаляю его после получения того, что мне нужно, он остается выключенным при использовании функции ReportLiveObjects.

Я пытался использовать свой собственный * и вручную удалял его, я пыталсяиспользуя ComPtr и пробуя различные способы освободить один из них.

Microsoft::WRL::ComPtr<ID3D11Texture2D> pTextureInterface = nullptr;
ID3D11Resource *res = nullptr;

HRESULT hres = DirectX::CreateWICTextureFromFileEx(m_pDev, const_cast<wchar_t*>(wStrAddress.c_str()), 0, D3D11_USAGE_DEFAULT, D3D11_BIND_SHADER_RESOURCE, 0, 0, DirectX::WIC_LOADER_IGNORE_SRGB, &res, tempTex.ReleaseAndGetAddressOf());

tempTex->GetResource(&res);
res->QueryInterface<ID3D11Texture2D>(&pTextureInterface);
D3D11_TEXTURE2D_DESC desc;
pTextureInterface->GetDesc(&desc);

RECT r;
r.left = 0;
r.top = 0;
r.right = desc.Width;
r.bottom = desc.Height;

if (pTextureInterface != nullptr)
{
    pTextureInterface.ReleaseAndGetAddressOf();
    pTextureInterface = nullptr;
}
if (res != nullptr)
{
    res->Release();
    res = nullptr;
}

Когда я создаю и использую pTextureInterface, я получаю предупреждение об утечке памяти DirectX для каждой текстуры, которую я загружаю, с Refcount 1. ЕслиЯ вообще не пытаюсь использовать pTextureInterface. У меня нет утечек, и все загружается и отображается правильно (за исключением их размеров, поскольку я вручную устанавливаю границы прямоугольника исходного изображения)

Я понимаю, что это, вероятно, некоторыекрошечный недосмотр, но я не смог найти работающего решения весь день, любая помощь будет признательна.

1 Ответ

0 голосов
/ 04 апреля 2019

При вызове tempTex->GetResource(&res); голый указатель, полученный во время вызова на CreateWICTextureFromFileEx, перезаписывается без его отпускания.Таким образом, счетчик ссылок для этого объекта не уменьшается и объект не просачивается.Похоже, tempTex->GetResource(&res); не нужен вообще.

...