我正在使用vector<char>
通过套接字发送和接收数据。在这个向量中,我存储了不同类型的数据。无符号整数和双精度。
要解码来自矢量的数据,我正在使用copy
函数。
vector<char> myVector = ... smth;
double value = 0.0;
copy(myVector.begin(), myVector.begin() + sizeof(value), &value);
它可以毫无问题地与Integer一起使用。但...
我的问题是,编译发出错误"free(): invalid pointer: 0x00000000006d0e30"
。我检查过,问题是双值,而不是矢量。我看了它的双重值的地址(0x6d0e38
)。为什么程序试图向后访问指针?
我很高兴,如果你能说我,我做错了什么。它是解码消息的好方法吗?
非常感谢你。
答案 0 :(得分:2)
我猜您需要相应地转换指针,以使ptr++
使用正确的尺寸(sizeof(char)
,而不是sizeof(double)
):
vector<char> myVector = ... smth;
double value = 0.0;
std::copy(myVector.begin(), myVector.begin() + sizeof(value),
reinterpret_cast<char*>(&value));
答案 1 :(得分:2)
不要这样做。通过套接字发送值的字符串表示形式。
std::stringstream ss;
double value = 0.0;
ss << value;
然后使用ss.str()
或者如果你真的需要一个char矢量:
std::vector<char> v(ss.begin(), ss.end());
- 编辑 -
如果你真的需要保持数据二进制,请执行
std::vector<char> v(sizeof(double));
double val = 0.5;
std::memcpy(&v[0],(char*)&val,sizeof(val));
...
double* out = (double*)&v[0];
std::cout << *out << std::endl;
答案 2 :(得分:2)
它可以毫无问题地与Integer一起使用。但...
肯定会不为整数工作。至少不是sizeof(int) > 1
的整数!因为它不会只写入一个整数,而是将myVector
中的字节扩展到sizeof(T)
整数,从而覆盖随机存储器。 (见夜魇的回答)
请使用memcpy
进行此类复制:
vector<char> myVector = ... smth;
double value = 0.0;
assert(myVector.size() == sizeof(double));
memcpy(&value, &myVector[0], std::min(myVector.size(), sizeof(double)));
// as an alternative to the assert + std::min() above, you could also throw
// an exception if myVector.size() == sizeof(double) does not hold.
// (that's what I'd do if the size should always match exactly)
memcpy
完全是针对那种事情(复制原始内存),我认为没有理由在这里使用其他任何东西。使用std::copy
并不能使C ++变得更好,特别是当你没有正确地使用它时。 std::copy
用于复制对象,而不是原始内存。