2012-10-07 67 views
1
#ifndef UNICODE 
#define UNICODE 
#endif 

#include <iostream> 
#include <Windows.h> 
#include <queue> 


using namespace std; 


void addSomeContent(queue<TCHAR*> &output) 
{ 
    TCHAR* buffer; 

    for(int i=0; i < 10000; i++) 
     buffer = new TCHAR[1000]; 

} 

int main() 
{  
    queue<TCHAR*> foo; 

    char sign; 

beginning: 

    addSomeContent(foo); 

    while (!foo.empty()) 
    { 
     delete [] foo.front(); 
     foo.pop(); 
    } 

    wcout<<TEXT("Press y to repeat\n"); 
    cin>>sign; 
    if(sign == 'y' || sign == 'Y') goto beginning; 

    return 0; 
} 

此程序的每次迭代都使用了20MB的RAM。爲什麼不通過這個指令派發?無法從陣列隊列中手動釋放內存

while (!foo.empty()) 
    { 
    delete [] foo.front(); 
    foo.pop(); 
    } 

回答

2

也許是因爲當你傳遞的foo引用addSomeContent,並addSomeContent使用它作爲命名output變量,addSomeContent被分配所有種類的內存,但從來沒有把這些分配在output,做回主, foo爲空。

因此我們希望對您有所幫助,但我們真的希望人們能夠嘗試以幫助自己。如果您在發佈之前進行了一些調試,那麼這將會是一個簡單的問題,因爲您自己發現了這個問題。

+0

+1爲你的第二段=)哦..第一個也是發現。 – paddy

0

您正在手動嘗試delete[]內存。這總是很糟糕。改爲使用std::queue<std::vector<TCHAR>>。另外,goto?這很糟糕,你應該感覺不好。

如果你想添加一個項目到隊列中,你需要調用它的一個成員函數。

下面的代碼實際上可能會起作用,可能不會驅使任何人看着它瘋狂。

void addSomeContent(std::queue<std::vector<TCHAR>> &output) 
{ 
    for(int i=0; i < 10000; i++) 
     queue.push_back(std::vector<TCHAR>(1000)); 
} 

int recursive_main() { 
    std::queue<std::vector<TCHAR>> foo; 
    addSomeContent(foo); 
    while(!foo.empty()) foo.pop(); // no need to delete 
    std::wcout << L"Press y to repeat\n"; 
    char sign; 
    std::cin >> sign; 
    if (sign == 'y' || sign == 'Y') return recursive_main(); 
    return 0; 
} 

int main() 
{  
    return recursive_main(); 
} 
+0

我不認爲用遞歸函數替換goto是最好的主意。遞歸沒有任何好處(因此可能會過度使用堆棧),並且可以在沒有其他幾種方法的情況下解決問題。 – mah