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();
  }
4

2 回答 2

2

也许是因为当您传递footo的引用addSomeContent并将addSomeContent其用作名为的变量output时,addSomeContent正在分配各种内存,但从未将这些分配放入output,所以回到 main 中foo是空的。

在 SO,我们希望提供帮助,但我们真的希望人们首先尝试帮助自己。如果您在发布之前进行了一些调试,那么您自己发现这将是一个简单的问题。

于 2012-10-07T13:07:44.063 回答
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();
}
于 2012-10-07T13:09:55.633 回答