我正在尝试使用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();
}
}
};
答案 0 :(得分:3)
所有这些指针数据成员都是指向引用计数的COM类型的指针。 Release
不一定会破坏指向的对象。它会减少引用计数,并且只有在没有更多引用的情况下才会销毁该对象。
您应该使用AddRef
和Release
来自动引用计数,而不是使用原始指针并自行调用CComPtr
和CComQIPtr
。