#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();
}
答案 0 :(得分:2)
也许是因为当您将foo
的引用传递给addSomeContent
,而addSomeContent
将其用作名为output
的变量时,addSomeContent
正在分配所有各种内存但从未在output
中放置这些分配,因此回到主要内容foo
为空。
在SO,我们希望提供帮助,但我们真的希望人们先尝试来帮助自己。如果你在发布之前做了一些调试,那么你就可以自己发现这个问题。
答案 1 :(得分: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();
}