2012-09-20 125 views
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

期望:

foo0
foo1



foo9

我在哪裏錯了?

+2

閱讀此:http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope – chris

回答

4

原因是您的buffer是堆棧上的本地變量。一旦你離開功能,它會過期。

如果您確實想要這樣做,請在堆上創建它TCHAR *buffer = new TCHAR[30];。你可能需要delete[]之後。

但是,我認爲使用一些內置類型或stl容器而不是操作指針會使您的代碼更具可讀性和可管理性。

1

當你做

s.push(buffer); 

你的指針到buffer隊列幾次(你會得到最好的情況下最後一個字符串的相同副本),但指針將是無效的,一旦你達到addSomeContent的結尾(如果不是分段違規,給你一個隨機內容)。您應該將字符串的副本添加到隊列中。

+0

'計數器永遠不會增加,只期望一個字符串'。你確定? – 0x6B6F77616C74

+0

好的,我看到了......使用靜態變量遞歸調用自己... –

+0

'您應該將字符串的副本添加到隊列中。' - 如何實現這一點? 's.push(* buffer);'不起作用。 – 0x6B6F77616C74

1

問題是TCHAR指針在堆棧中。爲了讓指針離開函數,你應該在堆中分配它(使用new)。

但爲什麼你使用TCHAR而不是std :: string?

+0

我使用TCHAR,因爲它與Windows API更「無縫」。 – 0x6B6F77616C74

+1

因此,您應該使用xvatar的建議,使用新的TCHAR [...]分配它。但是你必須在使用隊列後刪除它,否則你將不得不將它包裝在std :: auto_ptr或類似的東西中......或者......你使用std :: string :-) – Filipe

+0

' std :: auto_ptr' - 我從來沒有聽說過這個工具。謝謝,這將是非常有用的。 – 0x6B6F77616C74