无法从阵列队列中手动释放内存

时间:2012-10-07 13:00:56

标签: c++ memory-management stl queue

#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 个答案:

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