0

でクライアント サーバー チャットのようなアプリを作成しており、でC++UI を行ってい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 に答える