如何处理复制指针的释放

时间:2011-09-10 17:11:40

标签: c++ pointers com

我正在尝试使用C ++中的构造函数和析构函数构建一个结构(这是一件坏事吗?我应该使用类吗?),因为我不想编写不必要的10行delete struct.member每次成员都应该被解除分配

结构的成员主要是指向其他类型的指针。

但是,除了成员指针是唯一指针的选项之外,我还希望能够将另一个指针的副本分配给结构中的成员指针。因此,如果我尝试在结构的析构函数内释放该内存,它可能已经被释放,导致崩溃。 (特别是如果复制的指针来自同一结构体的另一个对象)

ptr-ptr-types而不是结构中的ptr-types也不能解决问题(我认为),因为我也想让成员能够成为一个指向对象的唯一指针。

我想到的一个可能的解决方案是让ptr-to-ptr和ptr指向ptr-to-ptr。但那只会效率很低。

我最好的解决方案是什么?

我希望(但怀疑)我的问题很清楚。

以下是一些可能有用的示例代码。

struct GraphicsDesc
{
public:
ID3D11VertexShader*         pSolidColorVS;
ID3D11PixelShader*          pSolidColorPS;
ID3D11InputLayout*          pInputLayout;
ID3D11ShaderResourceView*   pColorMap;
ID3D11SamplerState*         pSampler;
ID3D11BlendState*           pBlendState;
ID3D11Buffer*               pVertexBuffer;
UINT                        VertexSize;
D3D_PRIMITIVE_TOPOLOGY      Topology;

GraphicsDesc() 
{
    pSolidColorVS   = nullptr;
    pSolidColorPS   = nullptr;
    pInputLayout    = nullptr;
    pColorMap       = nullptr;
    pSampler        = nullptr;
    pBlendState     = nullptr;
    pVertexBuffer   = nullptr;
    VertexSize      = 0;
    Topology        = D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST;
}

virtual ~GraphicsDesc() 
{
    if (pVertexBuffer) {
        pVertexBuffer->Release();
    }
    if (pBlendState) {
        pBlendState->Release();
    }
    if (pSampler) {
        pSampler->Release();
    }
    if (pColorMap) {
        pColorMap->Release();
    }
    if (pInputLayout) {
        pInputLayout->Release();
    }
    if (pSolidColorPS) {
        pSolidColorPS->Release();
    }
    if (pSolidColorVS) {
        pSolidColorVS->Release();
    }
}
};

1 个答案:

答案 0 :(得分:3)

所有这些指针数据成员都是指向引用计数的COM类型的指针。 Release不一定会破坏指向的对象。它会减少引用计数,并且只有在没有更多引用的情况下才会销毁该对象。

您应该使用AddRefRelease来自动引用计数,而不是使用原始指针并自行调用CComPtrCComQIPtr