我有一个UDP服务器,它在缓冲区中获取消息,我想像邮箱一样存储。为此,我想创建一个可以保存这些传入消息的向量或映射,但我的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
我如何实现这一目标?
答案 0 :(得分:8)
如果您使用std::map<int, char *>
声明地图,则第二个成员只是指向char
的指针。
在您的代码中,此指针指向char
的第一个buffer
,并在map
中多次添加它,因此您最终会得到相同的结果。
如果您想使用char*
保留地图,则必须为要添加的每个条目分配一些内存,最后将其释放。
我建议您将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;
答案 1 :(得分:0)
发生了什么,你改变了变量buffer
指向的内存的值。如果要使用char*
,则必须为每条消息分配新内存。但正如评论中的某些人所提到的,您可以使用std
类型std::string
来执行您想要执行的操作。然后在幕后进行内存管理
编辑:在开头改变了短语,因为它含糊不清!