如何在地图中存储缓冲区的值而不是它的引用?

use*_*657 0 c++

我有一个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;
}
Run Code Online (Sandbox Code Playgroud)

结果是:

you
you
you
you
Run Code Online (Sandbox Code Playgroud)

但我想得到:

hello
how
are
you
Run Code Online (Sandbox Code Playgroud)

我该如何实现这一目标?

dkg*_*dkg 8

如果用std::map<int, char *>第二个成员声明你的地图只是一个指向a的指针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;
Run Code Online (Sandbox Code Playgroud)

见科利鲁