无法将已发布的值存储到矢量中

时间:2013-06-02 18:13:40

标签: c++ sockets ncurses

我正在C++创建一个类似客户端 - 服务器聊天的应用,而我正在ncurses中创建用户界面。 我想将所有邮件存储到vector<char *> msgVector,以便能够定期重绘整个屏幕。 然而,当我想要打印出值时,所有项目都具有相同的值 - 最后接受的消息。

void acceptMessages() {
char buffer[256];    
fd = c->createClient2Fd("localhost", 12345);
while (true) {
    memset(buffer, 0, sizeof ( buffer));
    int l = recv(fd, buffer, sizeof ( buffer), 0);
    msgVector.push_back(buffer);      
    redrawScreen();    
}

void redrawScreen() {    
    erase();
    mvhline(0, 0, ACS_HLINE, COLS);
    mvhline(LINES - 2, 0, ACS_HLINE, COLS);
    mvaddstr(LINES - 1, 0, "MESSAGE:");
    move(LINES - 1, 9);    

    // prints right count of messages
    // but on every line is printed only the last message
    for (int i = 0; i != msgVector.size(); i++)
        cout<<msgVector[i]<<endl;
    move(LINES - 1, 9);
    refresh();    
}

让我们说,接受的消息是:

1) Hello world!
2) My name is John
3) John Doe
4) Test message

然后我得到输出:

Test message
Test message
Test message
Test message

有人可以解释一下,是什么导致这种情况以及如何解决这个问题?

2 个答案:

答案 0 :(得分:5)

buffer衰变的指针始终是相同的(因为它是相同的变量),所以你总是将相同的指针推到矢量上。这将在循环完成后指向buffer(显然),它将仅包含最后一条消息。

要解决此问题,请考虑使用std::vector<std::string>代替并在每次迭代期间推回std::string(buffer)

答案 1 :(得分:1)

作为H2CO3 mentioned,向量中的每个元素都指向同一块内存。更糟糕的是buffer是一个局部变量,一旦从acceptMessages返回就会被破坏。这会导致未定义的行为,您输出到屏幕的文本可以是任何,而不仅仅是您添加的最后一行文本。

您应该切换到使用std::vector<std::string>,以便制作buffer的副本,并为您妥善管理内存。