0

我正在创建一个客户端-服务器聊天类应用程序,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

谁能解释一下,这可能是什么原因以及如何解决?

4

2 回答 2

5

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

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

于 2013-06-02T18:16:58.397 回答
1

正如H2CO3 提到的,向量中的每个元素都指向同一个内存块。更糟糕buffer的是一个局部变量,一旦你从acceptMessages. 这会导致未定义的行为,并且您输出到屏幕的文本可以是任何东西,而不仅仅是您添加的最后一行文本。

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

于 2013-06-02T18:31:16.960 回答