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

Posted

技术标签:

【中文标题】无法从数组队列中手动释放内存【英文标题】:Unable to manually free memory from queue of arrays 【发布时间】:2012-10-07 13:00:56 【问题描述】:
#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();
  

【问题讨论】:

【参考方案1】:

可能是因为当您将foo 的引用传递给addSomeContent,而addSomeContent 将其用作名为output 的变量时,addSomeContent 正在分配各种内存,但从未将这些分配放在@ 987654326@,所以回到 main,foo 是空的。

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

【讨论】:

你的第二段+1 =)哦..第一个也很准确。【参考方案2】:

您正在尝试手动delete[] 内存。这总是很糟糕。请改用std::queue&lt;std::vector&lt;TCHAR&gt;&gt;。另外,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();

【讨论】:

我不认为用递归函数替换 goto 是最好的主意。递归没有任何好处(因此可能会过度使用堆栈),如果没有这些措施,问题可以通过其他几种方式解决。

以上是关于无法从数组队列中手动释放内存的主要内容,如果未能解决你的问题,请参考以下文章

Linux内存机制以及手动释放swap和buffer和cache

Linux内存机制以及手动释放swap和buffer和cache

4动态内存分配(*****)

Linux内存机制以及手动释放swap和内存

Linux内存机制以及手动释放swap和内存

Linux内存机制以及手动释放swap和内存