我有一个 UDP 服务器,它在缓冲区中获取消息,我想像邮箱一样存储它。为此,我想创建一个 vector 或一个映射来保存这些传入消息,但我的映射或 vector 的值一直指向缓冲区的当前值。
如何获取正确存储在 map 或 vector 中的值?
为了演示我的问题,我编写了一个简单的静态示例来展示我的脚本中发生的事情:
#include <map>
#include <iostream>
int main(int argc, char const *argv[])
{
char buffer[65535];
std::map<int, char *> messages;
buffer = {'h','e','l','l','o'};
messages[0] = buffer;
buffer = {'h','o','w'};
messages[1] = buffer;
buffer = {'a','r','e'};
messages[2] = buffer;
buffer = {'y','o','u'};
messages[3] = buffer;
std::cout << messages[0] << std::endl;
std::cout << messages[1] << std::endl;
std::cout << messages[2] << std::endl;
std::cout << messages[3] << std::endl;
return 0;
}
结果是:
you
you
you
you
但我想得到:
hello
how
are
you
我如何实现这一目标?
最佳答案
如果您使用 std::map<int, char *>
声明您的 map 第二个成员只是一个指向 char
的指针.
在您的代码中,此指针指向第一个 char
你的buffer
然后在 map
中多次添加它因此你最后会得到相同的结果。
如果你想用 char*
保留你的 map 您必须为要添加的每个条目分配一些内存,并在最后释放它。
我建议你更换你的 char *
通过 std::string
并且操作会简单得多,例如:
#include <map>
#include <string>
#include <iostream>
std::map<int, std::string> messages;
messages[0] = "hello";
messages[1] = "how";
messages[2] = "are";
messages[3] = "you";
std::cout << messages[0] << std::endl;
std::cout << messages[1] << std::endl;
std::cout << messages[2] << std::endl;
std::cout << messages[3] << std::endl;
关于c++ - 如何在映射中存储缓冲区的值而不是其引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39250909/