0
#ifndef UNICODE
#define UNICODE
#endif

#include <iostream>
#include <Windows.h>
#include <queue>

using namespace std;

void addSomeContent(queue<TCHAR*> &s)
{
    static int counter=0;
    TCHAR buffer[30];

    wsprintf(buffer,TEXT("foo%d"),counter);

    s.push(buffer);
    counter++;

    if(counter < 10)
    addSomeContent(s);
}


int main (void)
{
    queue<TCHAR*> strings; 

    addSomeContent(strings);

    while(!strings.empty()) 
    {   
        wcout<<strings.front()<<endl;
        strings.pop();
    }

    system("pause");
    return (0);
}

出力:

foo0
♦</p>

望ましい:

foo0foo1 。
_ 。。foo9




私はどこが間違っていますか?

4

3 に答える 3

4

その理由は、あなたbufferがスタック上のローカル変数であるためです。機能を終了すると、有効期限が切れます。

本当にこの方法でやりたい場合は、 heap に作成してくださいTCHAR *buffer = new TCHAR[30];。そして、ある時点でそれが必要になる場合がありますdelete[]

ただし、ポインターを操作する代わりに組み込み型または stl コンテナーを使用すると、コードが読みやすく、管理しやすくなると思います。

于 2012-09-20T20:32:21.550 に答える
1

あなたがするとき

s.push(buffer);

ポインタをキューに数回追加しますbufferが(最良の場合は最後の文字列の同一のコピーを取得します)、最後に到達するとそのポインタは無効になりますaddSomeContent(セグメンテーション違反でない場合はランダムなコンテンツを提供します) 。文字列のコピーをキューに追加する必要があります。

于 2012-09-20T20:29:44.890 に答える
1

問題は、TCHAR ポインタがスタックにあることです。関数からポインターを渡すには、ヒープに割り当てる必要があります ( new を使用)。

しかし、なぜ std::string の代わりに TCHAR を使用しているのですか?

于 2012-09-20T20:38:46.433 に答える