C++ 如何在映射中存储缓冲区的值而不是其引用?

C++ 如何在映射中存储缓冲区的值而不是其引用?,c++,C++,我有一个UDP服务器,它在缓冲区中获取消息,我希望像邮箱一样存储这些消息。为此,我想创建一个向量或一个映射来保存这些传入消息,但映射或向量的值始终指向缓冲区的当前值 如何获得正确存储在地图或向量中的值 为了说明我的问题,我编写了一个简单的静态示例,它表示脚本中发生的情况: #include <map> #include <iostream> int main(int argc, char const *argv[]) { char buffer[65535];

我有一个UDP服务器,它在缓冲区中获取消息,我希望像邮箱一样存储这些消息。为此,我想创建一个向量或一个映射来保存这些传入消息,但映射或向量的值始终指向缓冲区的当前值

如何获得正确存储在地图或向量中的值

为了说明我的问题,我编写了一个简单的静态示例,它表示脚本中发生的情况:

#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;
}
但我想得到:

hello
how
are
you

如何实现这一点?

这里发生的事情是更改变量缓冲点的内存值。如果要使用char*,则必须为每条消息分配新内存。但是正如评论中提到的一些人所说,您可以使用std类型std::string来完成您想要做的事情。然后在后台进行内存管理


编辑:更改了开头的短语,因为它不明确

如果使用std::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;

只需使用std::string而不是char*。停止对字符串使用char*,并开始使用std::string。此外,您忘了输入空终止字符,这可能是未定义行为的结果,为什么要使用映射而不是向量或列表?这应该是因为您更改了变量缓冲点的内存,这是不正确的。您不能更改数组指向的位置。@NathanOliver:但您可以更改指向的内存;我就是这样读的:@LightnessRacesinOrbit我现在就是这样读的。我的第一个理解是,他们改变了阵列的位置。我想我是把记忆和位置而不是价值混淆了。@NathanOliver:我认为这句话可以从两个方面来理解,所以它可以说是模棱两可的。
#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;