我正在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
有人可以解释一下,是什么导致这种情况以及如何解决这个问题?
答案 0 :(得分:5)
buffer
衰变的指针始终是相同的(因为它是相同的变量),所以你总是将相同的指针推到矢量上。这将在循环完成后指向buffer
(显然),它将仅包含最后一条消息。
要解决此问题,请考虑使用std::vector<std::string>
代替并在每次迭代期间推回std::string(buffer)
。
答案 1 :(得分:1)
作为H2CO3 mentioned,向量中的每个元素都指向同一块内存。更糟糕的是buffer
是一个局部变量,一旦从acceptMessages
返回就会被破坏。这会导致未定义的行为,您输出到屏幕的文本可以是任何,而不仅仅是您添加的最后一行文本。
您应该切换到使用std::vector<std::string>
,以便制作buffer
的副本,并为您妥善管理内存。