Vector.push_back问题

时间:2018-06-14 07:17:56

标签: c++ for-loop vector memcpy push-back

以下问题涉及vector和memcpy的使用。正在使用的向量函数是.push_back,.data(),. size()。

有关消息的信息。

A)

#define BUFFERSIZE 8<<20
char* msg = new char[(BUFFERSIZE / 4)];

问题:为什么代码块b)没有工作?

当我运行下面的代码,在for循环中使用vector.push_back时,它会导致我正在使用的软件停止工作。我没有发送&#34; msg&#34;我也不读它,我只是创造它。

b)中

mVertex vertex;
vector<mVertex>mVertices;
for (int i = 0; i < 35; i++)
{
vertex.posX = 2.0;
vertex.posY = 2.0;
vertex.posZ = 2.0;
vertex.norX = 2.0;
vertex.norY = 2.0;
vertex.norZ = 2.0;
vertex.U = 0.5;
vertex.V = 0.5;
mVertices.push_back(vertex);
}
memcpy(msg,                                     // destination
    mVertices.data(),                           //  content  
    (mVertices.size() * sizeof(mVertex)));      // size

Screenshot of the error message from the software

通过在最后一行向mVertices.size()添加+1,软件运行正常。请参阅下面的示例代码。

c)中

mVertex vertex;
vector<mVertex>mVertices;
for (int i = 0; i < 35; i++)
{
vertex.posX = 2.0;
vertex.posY = 2.0;
vertex.posZ = 2.0;
vertex.norX = 2.0;
vertex.norY = 2.0;
vertex.norZ = 2.0;
vertex.U = 0.5;
vertex.V = 0.5;
mVertices.push_back(vertex);
}
memcpy(msg,                                     // destination
    mVertices.data(),                           //  content  
    (mVertices.size()+1 * sizeof(mVertex)));    // size

如果我删除for循环,代码也可以工作。

d)

mVertex vertex;
vector<mVertex>mVertices;

vertex.posX = 2.0;
vertex.posY = 2.0;
vertex.posZ = 2.0;
vertex.norX = 2.0;
vertex.norY = 2.0;
vertex.norZ = 2.0;
vertex.U = 0.5;
vertex.V = 0.5;
mVertices.push_back(vertex);

memcpy(msg,                                     // destination
    mVertices.data(),                           //  content  
    (mVertices.size() * sizeof(mVertex)));      // size

2 个答案:

答案 0 :(得分:1)

问题是一个基本的宏问题:宏定义文本替换,而不是逻辑或算术表达。

#define BUFFERSIZE 8<<20

创建一个文本宏。当你在这个表达式中使用它时(我删除了多余的括号):

char* msg = new char[BUFFERSIZE / 4];

预处理器BUFFERSIZE替换 8 << 20,所以就像你写的一样

char* msg = new char[8 << 20 / 4];

问题是8 << 20 / 4是256.那是因为表达式被评估为8 << (20/4),大概你认为它是(8 << 20) / 4。要解决这个问题(你应该总是用宏做这个),在宏本身的表达式周围加上括号:

#define BUFFERSIZE (8<<20)

顺便说一下,这就是为什么使用命名变量(无论是constexpr还是其他)会导致问题消失:变量得到 8 << 20,而不是文本,所以一切都很好。

答案 1 :(得分:0)

定义不符合你的想法。

#define BUFFERSIZE 8<<20

收益BUFFERSIZE / 4 == 8 << 20 / 4 == 8 << 5 == 256。因此msg中分配的内存很小,只能容纳mVertices

memcpy(msg, mVertices.data(), (mVertices.size() * sizeof(mVertex)));

写入错误的记忆。这可能会产生运行时错误。

您应该使用constexpr代替define来避免此类问题。