Как удалить объект через указатель, хранящийся в std :: list? - PullRequest
0 голосов
/ 05 июня 2018

Я использую Poco :: Thread.

 std::list<Thread*> threads;
    for(int i=0;i<100;i++){
       Thread* t=new Thread();
       RunnableClient* r=new RunnableClient(); //this class has run method()
       threads.push_back(t);
       t.start(*r);
    }
    std::list<Thread*>::iterator it;
    for (it = threads.begin(); it != threads.end(); ++it){
       if((*it)->isRunning() == false){
          threads.erase(it,it);
          }
     }

Метод erase (), использованный в вышеупомянутой функции, просто удаляет ссылку на объект, но не освобождает пространство, выделенное объектам Thread.Как освободить пространство, выделенное объектам Thread?

1 Ответ

0 голосов
/ 05 июня 2018

лучший способ справиться с этим - использовать умный указатель, такой как std::unique_ptr

, также вы должны вызвать join или detach в вашем потоке, прежде чем его деструктор будет вызван

asummingс ++ 11 и #include <memory>

std::list<std::unique_ptr<Thread> > threads;
    for(int i=0;i<100;i++){
       RunnableClient* r=new RunnableClient(); //this class has run method()
       threads.emplace_back(std::make_unique<Thread>());
       threads.back().start(*r);
    }
    //need to join or detatch thread before destoying them
    std::list<std::unique_ptr<Thread> >::iterator it;
    for (it = threads.begin(); it != threads.end(); ++it){
       if((*it)->isRunning() == false){
          threads.erase(it,it);
          }
     }
...