Graphics Can';是否释放ID3DX11Effect指针?

Graphics Can';是否释放ID3DX11Effect指针?,graphics,directx,directx-11,direct3d,direct3d11,Graphics,Directx,Directx 11,Direct3d,Direct3d11,我在演示中使用了效果框架 下面是我在头文件中的定义 ID3D11Buffer* m_pVertexBuffer; ID3D11Buffer* m_pIndexBuffer; ID3D11InputLayout* m_pInputLayout; ID3DX11Effect* m_pFx; ID3DX11EffectTechni

我在演示中使用了效果框架

下面是我在头文件中的定义

    ID3D11Buffer*                   m_pVertexBuffer;
    ID3D11Buffer*                   m_pIndexBuffer;
    ID3D11InputLayout*              m_pInputLayout;

    ID3DX11Effect*                  m_pFx;
    ID3DX11EffectTechnique*         m_pTechnique;
    ID3DX11EffectMatrixVariable*    m_pFxWorldViewProj;
我发布它们如下

void HillsDemo::UnLoadContent()
{
    if (m_pVertexBuffer) m_pVertexBuffer->Release();
    if (m_pIndexBuffer) m_pIndexBuffer->Release();
    if (m_pInputLayout) m_pInputLayout->Release();
    if (m_pTechnique) m_pTechnique->Release();
    if (m_pFx) m_pFx->Release();
}

然后我运行演示,当我关闭演示窗口时,出现了一个错误,这意味着HillsDemo已经停止工作。为什么?然后我删除了行
if(m_pFx)m_pFx->Release(),没有错误。那么释放
m_pFx
是否会导致错误

我查看了生效日期为11的文件,文件上有:

以下类型现在从IUnknown派生:ID3DX11EffectType、ID3DX11EffectVariable、I3DX11EffectPass、ID3DX11Effecttechnology、ID3DX11EffectGroup。请注意,这些对象不遵循标准COM引用计数规则,它们在释放父ID3DX11Effect时释放。这主要是为了简化托管语言中Effects 11的使用


这是否意味着我应该只释放
m_-pFx
,而不是同时释放
m_-pFx
m_-pTechnique
?有什么想法吗?

我假设您使用的是来自的最新版本的Effects 11,而不是基于您对project wiki的引用而使用的传统DirectX SDK副本

您应该真正考虑使用指向COM对象的指针,而不是原始指针。对于Effects 11,您只需将它们用于
ID3DX11Effect
实例。对于
ID3DX11EffectType
ID3DX11EffectVariable
I3DX11EffectPass
id3dx11effecttechnology
ID3DX11EffectGroup
,您应该坚持使用“原始指针”。不要费心在这些原始指针上调用
Release
,因为生存期由
ID3DX11Effect
控制

比如:

Microsoft::WRL::ComPtr<ID3D11Buffer> m_pVertexBuffer;
Microsoft::WRL::ComPtr<ID3D11Buffer> m_pIndexBuffer;
Microsoft::WRL::ComPtr<ID3D11InputLayout> m_pInputLayout;

Microsoft::WRL::ComPtr<ID3DX11Effect> m_pFx;
ID3DX11EffectTechnique* m_pTechnique;
ID3DX11EffectMatrixVariable* m_pFxWorldViewProj;

void HillsDemo::UnLoadContent()
{
    m_pVertexBuffer.Reset();
    m_pIndexBuffer.Reset();
    m_pInputLayout.Reset();
    m_pFx.Reset();
    m_pTechnique = nullptr;
    pFxWorldViewProj = nullptr;
}
Microsoft::WRL::ComPtr m_pVertexBuffer;
微软::WRL::ComPtr m_pIndexBuffer;
Microsoft::WRL::ComPtr m_pInputLayout;
微软:WRL::ComPtr m_pFx;
ID3DX11有效技术*m_pTechnique;
ID3DX11EffectMatrixVariable*m_pFxWorldViewProj;
void HillsDemo::UnLoadContent()
{
m_pVertexBuffer.Reset();
m_pIndexBuffer.Reset();
m_pInputLayout.Reset();
m_pFx.Reset();
m_pTechnique=nullptr;
pfxworldwiewproj=nullptr;
}

谢谢,如果我使用ComPtr,则不会出错。但是,如果我使用原始指针,只要我释放m_pFx,问题仍然没有得到解决。这太令人困惑了。我只是使用了
D3DX11CompileEffectFromFile
函数,就像这样:hr=D3DX11CompileEffectFromFile(L“color.fx”、nullptr、D3D\u COMPILE\u标准文件\u INCLUDE、shaderFlags、0、m\u pd3d设备、&m\u pFx、&errorBlob),错了吗?