【发布时间】:2018-04-21 11:02:36
【问题描述】:
我在下面附上了我的代码。我没有看到我做错了什么。我有一个试图序列化为字节数组的结构。我写了一些简单的代码来测试它。当我打印出对象的值时,这一切似乎都在运行时工作,但是一旦我点击 return 0 它就会抛出错误:
运行时检查失败 #2 - 变量“command”周围的堆栈已损坏。
我没有看到问题。感谢所有帮助。
namespace CommIO
{
enum Direction {READ, WRITE};
struct CommCommand
{
int command;
Direction dir;
int rwSize;
BYTE* wData;
CommCommand(BYTE* bytes)
{
int offset = 0;
int intsize = sizeof(int);
command = 0;
dir = READ;
rwSize = 0;
memcpy(&command, bytes + offset, intsize);
offset += intsize;
memcpy(&dir, bytes + offset, intsize);
offset += intsize;
memcpy(&rwSize, bytes + offset, intsize);
offset += intsize;
wData = new BYTE[rwSize];
if (dir == WRITE)
{
memcpy(&wData, bytes + offset, rwSize);
}
}
CommCommand() {}
}
int main()
{
CommIO::CommCommand command;
command.command = 0x6AEA6BEB;
command.dir = CommIO::WRITE;
command.rwSize = 128;
command.wData = new BYTE[command.rwSize];
for (int i = 0; i < command.rwSize; i++)
{
command.wData[i] = i;
}
command.print();
CommIO::CommCommand command2(reinterpret_cast<BYTE*>(&command));
command2.print();
cin.get();
return 0;
}
【问题讨论】:
-
您似乎假设
Direction的大小与int的大小相同。可能确实如此,但 C++ 并不能保证。 -
您似乎还假设
CommIO::CommCommand的成员将被布置在内存中而没有任何填充,这可能又会发生这种情况,但不能保证。 -
想想
wData和&wData的区别。你刚才分配的缓冲区地址是哪一个? -
在互联网上搜索“C++ 序列化”。您的过程称为“序列化”。
-
@JohnBollinger #pragma pack() 指令会对此有所帮助吗?
标签: c++ serialization struct