-3

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

关于味精的信息。

一个)

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

问题:为什么代码块 b) 不起作用?

当我在 for 循环中使用 vector.push_back 运行下面的代码时,它会导致我正在使用的软件停止工作。我没有发送“消息”,也没有阅读它,我只是在创建它。

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

来自软件的错误消息的屏幕截图

通过在最后一行向 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
4

2 回答 2

1

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

#define BUFFERSIZE 8<<20

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

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

预处理器替换 BUFFERSIZE8 << 20,所以就好像你写了

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

问题是8 << 20 / 4256。那是因为表达式被评估为8 << (20/4),大概是你想要的(8 << 20) / 4。要解决这个问题(并且您应该始终使用宏执行此操作),请在宏本身的表达式周围加上括号:

#define BUFFERSIZE (8<<20)

顺便说一句,这就是为什么使用命名变量(无论是否constexpr)使问题消失的原因:变量获取 8 << 20,而不是文本,所以一切都很好。

于 2018-06-14T08:55:34.247 回答
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避免此类问题。

于 2018-06-14T07:46:17.553 回答