Обработка очереди массивов

#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

Где я не прав?

0

Решение

Причина в том, что ваш buffer является локальной переменной в стеке. Как только вы выйдете из функции, срок ее действия истечет.

Если вы действительно хотите сделать это, создайте его в куче TCHAR *buffer = new TCHAR[30];, И вам может понадобиться delete[] это после некоторого момента.

Однако я думаю, что использование некоторых встроенных типов или контейнеров stl вместо манипулирования указателями сделает ваш код более читабельным и управляемым.

4

Другие решения

когда вы делаете

s.push(buffer);

Вы добавляете указатель на buffer в очередь несколько раз (вы получите идентичные копии последней строки в лучшем случае), но этот указатель будет недействительным, как только вы достигнете конца addSomeContent (давая вам случайный контент, если не нарушение сегментации). Вы должны добавить копию строки в очередь.

1

Проблема в том, что указатель TCHAR находится в стеке. Чтобы вы могли передать указатель из функции, вы должны разместить его в куче (с новым).

Но почему вы используете TCHAR вместо std :: string?

1
По вопросам рекламы [email protected]