0
#ifndef UNICODE
#define UNICODE
#endif

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

using namespace std;

void addSomeContent(queue<TCHAR*> &s)
{
    static int counter=0;
    TCHAR* buffer = new TCHAR[250]; //Allocate memory on heap

    wsprintf(buffer,TEXT("foo%d"),counter);

    s.push(buffer);
    counter++;

    if(counter < 10)
    addSomeContent(s);

}


int main (void)
{
    queue<TCHAR*> strings; 

    addSomeContent(strings);

    while(!strings.empty()) 
    {   
        wcout<<strings.front()<<endl;
        strings.pop();
    }

    //Here I want to destroy the "buffer" from the function "addSomeContent"
    wcout<<TEXT("Memory has been cleaned!\n");

    system("pause");
    return (0);
}

如果我在函数末尾删除了宽字符数组,我就无法处理引用它的队列。现在,我的简单程序可以编译并且工作正常,但显然在堆中保留垃圾并不被认为是一种安全的编程实践。
上次使用后如何删除“缓冲区”?

4

3 回答 3

2

您可以使用 a来完全避免内存释放,或者您可以简单地释放内存,然后再将其从类似queue<unique_ptr<TCHAR[]>>中删除:queue

delete[] strings.front();
strings.pop();
于 2012-09-21T13:17:21.713 回答
2

同意 Seth 为您的队列使用 unique_ptr,或者您可以简单地调用

   delete[] strings.front()

之前strings.pop()

front()应该用来确保我们清理我们将要清理的元素,pop()即队列中最旧的元素,而不是back()最新的元素!

于 2012-09-21T04:55:06.183 回答
1

如果您只想使用字符串,我会考虑使用

typedef std::basic_string<TCHAR> tstring;
std::queue<tstring> strings;

否则你可以使用

std::queue<std::unique_ptr<TCHAR[]>> strings; // notice the [], they are important!

unique_ptr 是 C++11,但我认为所有主要编译器都支持它。我什至不会考虑手动删除[]。它很容易出错,而且不是异常安全的。

于 2012-09-21T04:57:32.503 回答