как бороться с освобождением скопированных указателей - PullRequest
2 голосов
/ 10 сентября 2011

Я пытаюсь построить структуру с помощью конструктора и деструктора в C ++ (это плохая вещь? Должен ли я использовать класс вместо этого?), Потому что я не хотел бы писать ненужные 10 строк для удаления struct.member каждый раз, когда члены должны быть освобождены

Члены структуры в основном являются указателями на другие типы.

Однако, кроме того, что указатель члена является уникальным указателем, я также хочу иметь возможность назначить копию другого указателя указателю на член в структуре. Следовательно, если я попытаюсь освободить эту память внутри деструктора структуры, она может быть уже освобождена, что приведет к сбою. (особенно если скопированный указатель был из другого объекта той же структуры)

ptr для ptr-типов вместо ptr-типов в структуре также не решит проблему (я думаю), поскольку я также хочу позволить члену иметь возможность быть уникальным указателем на объект.

Возможное решение, о котором я подумал, состоит в том, чтобы иметь и 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 Ответ

3 голосов
/ 10 сентября 2011

Все эти члены данных указателя являются указателями на типы COM, которые подсчитываются.Release не обязательно уничтожает указанный объект.Он уменьшает счетчик ссылок и уничтожает объект только в том случае, если на него больше нет ссылок.

Вместо того, чтобы использовать необработанные указатели и вызывать AddRef и Release самостоятельно, вы должны использовать CComPtr и * 1007.*, которые автоматизируют подсчет ссылок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...