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

标签 c++

我有一个 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;

See on Coliru

关于c++ - 如何在映射中存储缓冲区的值而不是其引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39250909/

相关文章:

c++ - gcov 检测共享对象引用 __gcov_init 隐藏符号

c++ - 带有自定义* .o文件的“ld: warning: cannot find entry symbol _start; defaulting to 0000000000401000”

c++ - 关于 setDataBuffer (OCCI) 包装器的实践

c++ - VBA将Excel样式列名称(具有52个字符集)转换为原始数字

c++ - 自动构建 ID

c++ - 字符串和函数对象

c++ - 在不同线程上时,cv::imshow 不显示 cv::mat 颜色

c++ - QJsonDocument 在 C++ 中列出或排列

c++ - Qt Creator 在 Windows 下构建错误

c++ - 如何在 .pri 文件的内容前加上路径?