Каков лучший смарт-указатель для использования с вектором указателя

В настоящее время у меня есть класс, который выглядит следующим образом в 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?

Любые пункты или чтение высоко ценится.

0

Решение

Это все о владение.

Общий указатель действительно стоит здесь?

Только если вам нужно совместное владение. Если нет, просто используйте 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.

4

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

Если вы настаиваете на сохранении 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>>,

3

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