将DirectX对象推入std :: queue

时间:2017-08-21 11:48:35

标签: c++ directx std

我正在开发一个小型发布管理器,用于在旧对象时删除它们。

我正在使用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

创建的

2 个答案:

答案 0 :(得分:0)

我发现了问题。 我得到的RenderPlatform有这样的PushToReleaseManager()方法:

auto rPlat = (dx11on12::RenderPlatform*)(renderPlatform);

此强制转换失败,因为renderPlatform无效且返回空指针。问题是我允许我调用该方法没有问题,我猜是因为它周围有一些垃圾内存。

感谢您的回答!

答案 1 :(得分:-3)

尝试使用智能指针。它们比明确尝试释放内存要好得多。