我正在尝试用 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
不一定会销毁所指向的对象。它会减少引用计数,并且仅在没有更多引用时才销毁该对象。
您应该使用 CComPtr
和 CComQIPtr
,而不是使用原始指针并自行调用 AddRef
和 Release
,自动进行引用计数。
关于c++ - 如何处理复制指针的释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7373264/