c++ - 如何处理复制指针的释放

标签 c++ pointers com

我正在尝试用 C++ 构建一个带有构造函数和析构函数的结构体(这是一件坏事吗?我应该使用类来代替吗?),因为我不想编写不必要的 10 行删除 struct.member每次应该释放成员

结构体的成员大多是指向其他类型的指针。

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

ptr 到 ptr-types 而不是结构中的 ptr-types 也不能解决问题(我认为),因为我还希望允许成员能够成为指向对象的唯一指针。

我想到的一个可能的解决方案是同时拥有一个 ptr-to-ptr 和一个由 ptr-to-ptr 指向的 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();
    }
}
};

最佳答案

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

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

关于c++ - 如何处理复制指针的释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7373264/

相关文章:

c++ - GLM 是否与 GLload 和 GCC 兼容

c - 无法在 Windows 7 上创建高程 COM 对象

c - 使用 free() 释放内存不起作用

pointers - 将值传递给接口(interface){}

com - 可以在 VBScript 中按名称访问 WMI 对象的属性吗?

.net - 免注册COM可以应用于DLL吗?

c++ - 为什么我的编译器无法识别 "Bond() = default;"?

c++ - 如何解决 C++ 中的 typedef 重定义?

c++ - 在Qt Creator中运行Wt Framework

c - 当我打印它时,指向二维数组的指针会更改地址