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>

期望:

foo0
foo1

.
.
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 )。

但是你为什么使用 TCHAR 而不是 std::string?

于 2012-09-20T20:38:46.433 回答