Выделение функции A из памяти времени выполнения внутри функции B

#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);
}

Если бы я удалил широкий массив символов в конце функции, я бы не смог обработать свою очередь, которая ссылается на нее. Теперь моя простая программа компилируется и работает нормально, но, очевидно, хранение мусора в куче не считается безопасной практикой программирования.
Как удалить «буфер» сразу после его использования в прошлый раз?

0

Решение

Вы можете использовать queue<unique_ptr<TCHAR[]>> чтобы полностью освободить память, или вы можете просто освободить память, прежде чем удалить ее из queue вот так:

delete[] strings.front();
strings.pop();
2

Другие решения

Согласитесь с Сетом об использовании unique_ptr для вашей очереди, или вы можете просто позвонить

   delete[] strings.front()

перед strings.pop()

front() должны быть использованы для обеспечения очистки элемента, который мы собираемся pop() то есть самый старый элемент в очереди, а не back(), который является самым новым!

2

Если вы просто хотите работать со строками, я хотел бы просто использовать

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, но я думаю, что он поддерживается всеми основными компиляторами. Я бы даже не подумал удалить [] это вручную. Он очень уязвим к ошибкам и не безопасен для исключений.

1
По вопросам рекламы [email protected]