C++ 那里';这是我的向量声明/循环/但我';我不知道是什么

C++ 那里';这是我的向量声明/循环/但我';我不知道是什么,c++,vector,windows-phone-8,reference,direct3d,C++,Vector,Windows Phone 8,Reference,Direct3d,我最初只是在游戏中为小行星(立方体)使用一组缓冲区的单个声明。效果很好 我想创建一个缓冲向量,以便显示多个小行星。当我将缓冲区的声明更改为向量时,所有的麻烦都爆发了 编译器没有抱怨,但在运行时我得到: Unhandled exception at 0x71879C01 (Msvcr110d.dll) in Game.exe: An invalid parameter was passed to a function that considers invalid parameters fatal.

我最初只是在游戏中为小行星(立方体)使用一组缓冲区的单个声明。效果很好

我想创建一个缓冲向量,以便显示多个小行星。当我将缓冲区的声明更改为向量时,所有的麻烦都爆发了

编译器没有抱怨,但在运行时我得到:

Unhandled exception at 0x71879C01 (Msvcr110d.dll) in Game.exe: An invalid parameter was passed to a function that considers invalid parameters fatal.
输出日志:

First-chance exception at 0x770D277C in Game.exe: Microsoft C++ exception: std::out_of_range at memory location 0x014A90CC.
The thread 0x8f4 has exited with code 0 (0x0).
First-chance exception at 0x770D277C in Game.exe: Microsoft C++ exception: [rethrow] at memory location 0x00000000.
First-chance exception at 0x770D277C in Game.exe: Microsoft C++ exception: std::out_of_range at memory location 0x014A9E10.
Unhandled exception at 0x712D9C01 (Msvcr110d.dll) in Game.exe: An invalid parameter was passed to a function that considers invalid parameters fatal.

我已经这样声明了我的缓冲区:

// Asteroid Buffers 
vector<Microsoft::WRL::ComPtr<ID3D11Buffer>> asteroidVertexBuffers;
vector<Microsoft::WRL::ComPtr<ID3D11Buffer>> asteroidIndexBuffers;
vector<uint32> asteroidIndexCounts;
我迭代并将缓冲区推入顶点:

int asteroidCount = 3;

asteroidVertexBuffers.reserve( asteroidCount );
asteroidIndexBuffers.reserve( asteroidCount );
asteroidIndexCounts.reserve( asteroidCount );
    for( int a = 0; a < asteroidCount; a++ )
    {
        D3D11_SUBRESOURCE_DATA asteroidVertexBufferData = {0};
        asteroidVertexBufferData.pSysMem = asteroidVertices;
        asteroidVertexBufferData.SysMemPitch = 0;
        asteroidVertexBufferData.SysMemSlicePitch = 0;
        CD3D11_BUFFER_DESC asteroidVertexBufferDesc(sizeof(asteroidVertices), D3D11_BIND_VERTEX_BUFFER);
        DX::ThrowIfFailed(
            m_d3dDevice->CreateBuffer(
                &asteroidVertexBufferDesc,
                &asteroidVertexBufferData,
                &asteroidVertexBuffers.at( a )
                )
            );

        // Runtime Crash here

        asteroidIndexCounts.at( a ) = ARRAYSIZE(asteroidIndices);

        D3D11_SUBRESOURCE_DATA asteroidIndexBufferData = {0};
        asteroidIndexBufferData.pSysMem = asteroidIndices;
        asteroidIndexBufferData.SysMemPitch = 0;
        asteroidIndexBufferData.SysMemSlicePitch = 0;
        CD3D11_BUFFER_DESC asteroidIndexBufferDesc(sizeof(asteroidIndices), D3D11_BIND_INDEX_BUFFER);
        DX::ThrowIfFailed(
            m_d3dDevice->CreateBuffer(
                &asteroidIndexBufferDesc,
                &asteroidIndexBufferData,
                &asteroidIndexBuffers.at( a )
                )
            );
    }
for(int a=0;aCreateBuffer(
&小行星顶点,
&VertexBufferData,
&顶点缓冲区。位于(a)
)
);
//运行时崩溃在这里
asteroidIndexCounts.at(a)=阵列化(小行星指数);
D3D11_子资源_数据索引BufferData={0};
asteroidIndexBufferData.psysem=小行星指数;
asteroidIndexBufferData.SysMemPitch=0;
asteroidIndexBufferData.SysMemSlicePitch=0;
CD3D11_BUFFER_DESC asteroidIndexBufferDesc(小行星索引大小),D3D11_BIND_INDEX_BUFFER);
DX::ThrowIfFailed(
m_d3dDevice->CreateBuffer(
&小行星索引Bufferdesc,
&小行星索引缓冲数据,
&小行星索引缓冲区(a)
)
);
}
可能有用的注释

   std::vector<class Microsoft::WRL::ComPtr<struct ID3D11Buffer>,class std::allocator<class Microsoft::WRL::ComPtr<struct ID3D11Buffer> > >::operator []
    这是一个Direct3D C++ + /LIE的Windows Phone 8应用程序
  • Renderer.cpp可在此处完整查看:(ln:143+)
  • Renderer.h可以在此处完整查看:(ln:63+)

更新:我想我发现了问题(&到重新分配的内存)

   std::vector<class Microsoft::WRL::ComPtr<struct ID3D11Buffer>,class std::allocator<class Microsoft::WRL::ComPtr<struct ID3D11Buffer> > >::operator []
我想我找到了问题所在。我刚刚注意到,第一个和第二个参数中的_是内存的引用,这意味着它也需要是内存的向量。。。我会纠正,看看它是否有效

更新::我错了或者我做错了…

我为新类型添加了一些向量,然后将其全部插入到我的代码中:

    int asteroidCount = 3;

    asteroidVertexBuffersData.reserve( asteroidCount );
    asteroidVertexBuffersDesc.reserve( asteroidCount );
    asteroidVertexBuffers.reserve( asteroidCount );
    asteroidIndexBuffers.reserve( asteroidCount );
    asteroidIndexCounts.reserve( asteroidCount );

    for( int a = 0; a < asteroidCount; a++ )
    {
        D3D11_SUBRESOURCE_DATA asteroidVertexBufferData = {0};
        asteroidVertexBuffersData.push_back( asteroidVertexBufferData );

        asteroidVertexBuffersData.at(a).pSysMem = asteroidVertices;
        asteroidVertexBuffersData.at(a).SysMemPitch = 0;
        asteroidVertexBuffersData.at(a).SysMemSlicePitch = 0;

        CD3D11_BUFFER_DESC asteroidVertexBufferDesc(sizeof(asteroidVertices), D3D11_BIND_VERTEX_BUFFER);
        asteroidVertexBuffersDesc.push_back( asteroidVertexBufferDesc );
        DX::ThrowIfFailed(
            m_d3dDevice->CreateBuffer(
                &asteroidVertexBuffersDesc.at(a),
                &asteroidVertexBuffersData.at(a),
                &asteroidVertexBuffers.at(a)
                )
            );
int-count=3;
小行星顶点缓冲数据保留区(小行星计数);
小行星顶点缓冲区(小行星计数);
小行星顶点缓冲区保留区(小行星计数);
小行星指数缓冲区(小行星计数);
小行星数量储量(小行星数量);
对于(int a=0;aCreateBuffer(
&(a)处的顶点缓冲区,
&(a)处的数据,
&顶点缓冲区。位于(a)
)
);
它抛出了同样的错误:'(

更新::我仔细检查了故障过程,发现了以下有趣的地方

pszFunction包含:

   std::vector<class Microsoft::WRL::ComPtr<struct ID3D11Buffer>,class std::allocator<class Microsoft::WRL::ComPtr<struct ID3D11Buffer> > >::operator []
std::vector::operator[]


在不知道您使用的是哪个Direct3D版本或如何创建设备的情况下,很难知道您出了什么问题。其他参数之一可能不正确并导致错误

由于第3个参数需要一个
ID3D11Buffer**
,它是指向指针的指针,因此您不需要对所需地址的向量中的项目进行引用

下面是一个小例子,它很有效。如果你的用法不同,请编辑问题,包括一个像这样的小例子,这样我们可以看到足够的内容,给你一个好的答案

#include <Windows.h>
#include <d3d11.h>
#include <DirectXMath.h>
#include <iostream>
#include <vector>

using DirectX::XMFLOAT3;

#pragma comment(lib, "d3d11.lib")

int main()
{
    ID3D11Device* device = NULL;
    if(FAILED(D3D11CreateDevice(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, 0, NULL, 0, D3D11_SDK_VERSION, &device, NULL, NULL)))
    {
        std::cerr << "Device creation Failed!\n";
        return 0;
    }

    struct SimpleVertexCombined
    {
        XMFLOAT3 Pos;
        XMFLOAT3 Col;
    };

    SimpleVertexCombined verticesCombo[] =
    {
        XMFLOAT3(0.0f, 0.5f, 0.5f),
        XMFLOAT3(0.0f, 0.0f, 0.5f),
        XMFLOAT3(0.5f, -0.5f, 0.5f),
        XMFLOAT3(0.5f, 0.0f, 0.0f),
        XMFLOAT3(-0.5f, -0.5f, 0.5f),
        XMFLOAT3(0.0f, 0.5f, 0.0f),
    };

    D3D11_BUFFER_DESC bufferDesc;
    bufferDesc.Usage = D3D11_USAGE_DEFAULT;
    bufferDesc.ByteWidth = sizeof(SimpleVertexCombined)* 3;
    bufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
    bufferDesc.CPUAccessFlags = 0;
    bufferDesc.MiscFlags = 0;

    D3D11_SUBRESOURCE_DATA InitData;
    InitData.pSysMem = verticesCombo;
    InitData.SysMemPitch = 0;
    InitData.SysMemSlicePitch = 0;

    std::vector<ID3D11Buffer*> VertexBuffers(1);

    HRESULT hr = device->CreateBuffer(&bufferDesc, &InitData, &VertexBuffers[0]);
    if(SUCCEEDED(hr))
    {
        std::cout << "CreateBuffer Success! - Buffer = 0x" << VertexBuffers[0] << "\n";
    }
    else
    {
        std::cout << "CreateBuffer Failure!\n";
    }
    return 0;
}
#包括
#包括
#包括
#包括
#包括
使用DirectX::XMFLOAT3;
#pragma注释(lib,“d3d11.lib”)
int main()
{
ID3D11Device*device=NULL;
if(失败(D3D11CreateDevice(NULL,D3D_驱动程序类型_硬件,NULL,0,NULL,0,D3D11_SDK_版本,&设备,NULL,NULL)))
{
std::cerr CreateBuffer(&bufferDesc,&InitData,&VertexBuffers[0]);
如果(成功(hr))
{

std::coutvector::at()返回值的类型是引用本身,所以我认为您应该使用“AsteroVertexBuffers.at(a)”作为方法“CreateBuffer”的第三个参数


请参阅:

调整大小而不是保留:

    int asteroidCount = 3;

    asteroidVertexBuffers.resize( asteroidCount );
    asteroidIndexBuffers.resize( asteroidCount );
    asteroidIndexCounts.resize( asteroidCount );

你能说明你是如何声明每个参数的吗?你确定这个异常是由于第三个参数引起的吗?看看CreateBuffer的用法,我认为上面的任何一个代码片段都可以。你的向量是指向顶点缓冲区的指针(参见)我到家后会提供更多信息,谢谢你的帮助。我认为在这种情况下向量的定义是正确的。我编辑了我的OP,看看是否有人能找出问题所在。有什么想法吗,伙计?我已经筋疲力尽了,无法工作^ ^尝试使用resize而不是reserve for
AsteroperVertexBuffers
。我从来没有看到你推过我把任何东西塞进里面,让它空着。哈,我先到了那里。不过谢谢你的帮助!:)当时很绝望,只是想,等一下,我会调试它的大小