我正在开发一个小型发布管理器,用于在旧对象时删除它们。
我正在使用std::queue
来保持年龄&指向对象的指针。
这是我用来将值推送到队列中的方法:
ID3D12Resource* texture; // declaration
renderPlat->PushToReleaseManager(texture);
std::queue<std::pair<int,void*>> mResourceBin; // declaration
void RenderPlatform::PushToReleaseManager(ID3D12Resource* res)
{
if (!res)
return;
mResourceBin.push(std::pair<int, void*>(0, res));
}
但这会导致抛出异常:读取访问冲突 / std::_Deque_alloc<std::_Deque_base_types<std::pair<int,void * __ptr64>,std::allocator<std::pair<int,void * __ptr64> > > >::_Myoff(...) returned 0x6B0
:
void push_back(value_type&& _Val)
{ // insert element at end
this->_Orphan_all();
_PUSH_BACK_BEGIN; // <--- The exception is thrown here!!!
this->_Getal().construct(
_Unfancy(this->_Map()[_Block] + _Newoff % _DEQUESIZ),
_STD forward<value_type>(_Val));
_PUSH_BACK_END;
}
我要删除的对象是ID3D12Resource,它继承自IUnknown
编辑:
我正在使用: Visual Studio 2015(v140) 。
编辑2:
传递给PushToReleaseManager()的ID3D12Resource *对象是使用ID3D12Device::CreateCommittedResource
创建的答案 0 :(得分:0)
我发现了问题。 我得到的RenderPlatform有这样的PushToReleaseManager()方法:
auto rPlat = (dx11on12::RenderPlatform*)(renderPlatform);
此强制转换失败,因为renderPlatform无效且返回空指针。问题是我允许我调用该方法没有问题,我猜是因为它周围有一些垃圾内存。
感谢您的回答!
答案 1 :(得分:-3)
尝试使用智能指针。它们比明确尝试释放内存要好得多。