#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
Где я не прав?
Причина в том, что ваш buffer
является локальной переменной в стеке. Как только вы выйдете из функции, срок ее действия истечет.
Если вы действительно хотите сделать это, создайте его в куче TCHAR *buffer = new TCHAR[30];
, И вам может понадобиться delete[]
это после некоторого момента.
Однако я думаю, что использование некоторых встроенных типов или контейнеров stl вместо манипулирования указателями сделает ваш код более читабельным и управляемым.
когда вы делаете
s.push(buffer);
Вы добавляете указатель на buffer
в очередь несколько раз (вы получите идентичные копии последней строки в лучшем случае), но этот указатель будет недействительным, как только вы достигнете конца addSomeContent
(давая вам случайный контент, если не нарушение сегментации). Вы должны добавить копию строки в очередь.
Проблема в том, что указатель TCHAR находится в стеке. Чтобы вы могли передать указатель из функции, вы должны разместить его в куче (с новым).
Но почему вы используете TCHAR вместо std :: string?