将std :: vector复制到void指针

时间:2013-08-27 08:02:22

标签: c++ direct3d directx-9

我有一个std::vector<MyVertex>,其中MyVertex是一个结构。我必须将此数据推送到Direct3D 9中的顶点缓冲区,我见过的示例使用memcpy。不幸的是,memcpy崩溃了我的申请,所以我肯定做错了。

std::vector<MyVertex> m_VertsBuff0;

void* vbPtr;
vertexbuffer->Lock (0, 0, &vbPtr, D3DLOCK_DISCARD);
memcpy (vbPtr, &m_VertsBuff0[0], sizeof(m_VertsBuff0)); // also tried sizeof(MyVertex)*m_VertsBuff0.size()
// std::copy(m_VertsBuff0.begin(), m_VertsBuff0.end(), vbPtr); // gives a compiler error void* unknown size
vertexbuffer->Unlock ();
device->SetStreamSource (0, vertexbuffer, 0, sizeof(m_VertsBuff0[0]));

更新:
这在我刚使用array而不是vector之前就已经开始了。我似乎不必首先初始化void*,因为这个例子工作得很好。然后我将其更改为vector并且出错了。为什么我必须突然初始化void*,这样做仍然会导致我的应用程序崩溃。

memcpy (vbPtr, m_VertsBuff0.data(), sizeof(MyVertex) * m_VertsBuff0.size());

3 个答案:

答案 0 :(得分:1)

使用m_VertsBuff0.size() * sizeof(MyVertex)代替sizeof(m_VertsBuff0) 并确保'vbPtr'指向正确分配的内存,例如:

void* vbPtr = new char[v.size() * sizeof(int)];

答案 1 :(得分:0)

您必须初始化您的vbPtr;

  void* vbPtr = new char[v.size() * sizeof(MyVertex)];
  memcpy (vbPtr, v.data(), v.size() * sizeof(MyVertex));

答案 2 :(得分:0)

嗯,我想你必须在调用map

之前将vbPtr初始化为NULL