Когда форсированный поток утилизируется, временные переменные, созданные в нем, стираются из памяти? - PullRequest
0 голосов
/ 09 ноября 2010

Итак, у меня есть структура и очередь (измененная, взята из здесь ) в файле .h моего класса, например:

  struct VideoSample
  { 
      const unsigned char * buffer;
      int len;
  };

  concurrent_queue<VideoSample * > VideoSamples;

В файле .cpp у меня есть функция, которую я запускаю каждый раз в новом потоке, посылая несколько аргументов:

void VideoEncoder::AddFrameToQueue(const unsigned char *buf, int size )
{
VideoSample * newVideoSample = new VideoSample;
VideoSamples.try_pop(newVideoSample);
newVideoSample->buffer = buf;
newVideoSample->len = size;
VideoSamples.push(newVideoSample);
}

Итак, как вы видите, я стараюсь, чтобы VideoSamples содержал не более одного элемента (требование).

Интересно, ОС удалит новый VideoSample при нарушении работы потока? Или как его удалить?

1 Ответ

1 голос
/ 09 ноября 2010

Нет. ОС не удалит этот динамически размещенный VideoSample.

Вы должны будете сделать это, когда закончится нить.

Трудно сказать время жизни ваших объектов из вашего поста. Если ваш VideoSamples является членом класса VideoEncoder, а ваш класс VideoEncoder уничтожается по завершении потока, вы можете сделать это в деструкторе VideoEncoder. Если ваш контейнер VideoSamples будет разрушен в конце потока, вы можете заставить VideoSamples хранить некоторые формы интеллектуальных указателей на VideoSample *, чтобы упростить более автоматическое управление памятью.

Вы также теряете память, если try_pop возвращает true, поскольку вы потеряете указатель на недавно выделенный VideoSample.

...