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

时间:2016-08-31 13:25:02

标签: 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;
}

结果是:

you
you
you
you

但我想得到:

hello
how
are
you

我如何实现这一目标?

2 个答案:

答案 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;

See on Coliru

答案 1 :(得分:0)

发生了什么,你改变了变量buffer指向的内存的值。如果要使用char*,则必须为每条消息分配新内存。但正如评论中的某些人所提到的,您可以使用std类型std::string来执行您想要执行的操作。然后在幕后进行内存管理

编辑:在开头改变了短语,因为它含糊不清!