#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 ♦
所需:
foo0 foo1 。 。 。 foo9
我哪里错了?
发布于 2012-09-20 20:32:21
原因是您的buffer是堆栈上的本地变量。一旦您离开该函数,它将过期。
如果您真的想这样做,请在堆TCHAR *buffer = new TCHAR[30];上创建它。过了一段时间后,你可能需要delete[]。
但是,我认为使用一些内置类型或stl容器来代替操作指针将使您的代码更加可读性和可管理性。
发布于 2012-09-20 20:29:44
当你这样做的时候
s.push(buffer);您可以多次将指向buffer的指针添加到队列中(在最好的情况下,您将得到最后一个字符串的相同副本),但是当您到达addSomeContent的末尾时,该指针将是无效的(如果没有分段冲突,则给出一个随机内容)。应该将字符串的副本添加到队列中。
发布于 2012-09-20 20:38:46
问题是TCHAR指针在堆栈中。为了将指针从函数中传递出去,您应该在堆中分配它(使用new )。
但是为什么要使用TCHAR而不是std::string呢?
https://stackoverflow.com/questions/12520232
复制相似问题