В настоящее время у меня есть класс, который выглядит следующим образом в threadhelper.hpp:
class Thread : public Helper<finder>{
/* lots of helper function*/
public:
Thread();
startThread(const std::string& name);
private:
Thread(const Thread&);
Thread & operator=(const Thread&);
boost::ptr_vector<thread::Foo<Bar> > m_workerThreads;
};
И позже в конструкторе я делаю это (в cpp):
Thread::Thread()
{
/*bunch of other stuff here.*/
for(; numThreads < numberOfWorkers; ++numThreads)
{
std::auto_ptr<thread::Foo<Bar> > newThread(new Thread());
newThread->startThread();
m_workerThreads.push_back(newThread);
}
После некоторого исследования я прочитал некоторые плохие вещи об авто указателях и удаляю при копировании, который, кажется, здесь не имеет значения; однако, кажется, что в интернете есть что-то против auto_ptr, и большинство людей говорят, что вместо него следует использовать boost :: shared_ptr. Это кажется мне плохой идеей, так как этот код должен быть быстрым, а shared_ptr более дорогим.
Мне было интересно, если кто-нибудь может дать мне некоторое представление об этом коде. Общий указатель действительно стоит здесь? Есть ли другие проблемы с использованием автоматического указателя, о которых я не знаю? Наконец, после исследования я не могу найти, есть ли умный указатель, который лучше всего работает с boost :: ptr_vector?
Любые пункты или чтение высоко ценится.
Это все о владение.
Общий указатель действительно стоит здесь?
Только если вам нужно совместное владение. Если нет, просто используйте std::unique_ptr
,
Есть ли другие проблемы с использованием автоматического указателя, о которых я не знаю?
Увидеть Почему auto_ptr считается устаревшим? а также Почему неправильно использовать std :: auto_ptr<> со стандартными контейнерами?
Наконец, после исследования я не могу найти, есть ли умный указатель, который лучше всего работает с boost :: ptr_vector?
Вы можете просто использовать std::vector<std::unique_ptr<x>>
или же std::vector<std::shared_ptr<x>>
, Там нет смысла для boost::ptr_vector
больше в C ++ 11 AFAIK.
Если вы настаиваете на сохранении boost::ptr_vector
Я бы предложил просто перейти к этому:
for(; numThreads < numberOfWorkers; ++numThreads)
{
m_workerThreads.push_back(new Thread);
}
for(size_t x = 0; x < m_workerThreads.size(); ++x)
{
m_workerThreads[x]->Start();
}
Однако лично я бы просто перешел на std::vector<std::unique_ptr<Thread>>
,