0

目前我在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 的智能指针?

任何观点或阅读都非常感谢。

4

2 回答 2

4

一切都与所有权有关。

共享指针在这里真的值得吗?

仅当您需要共享所有权时。如果没有,只需使用std::unique_ptr.

在这里使用自动指针还有其他我不知道的问题吗?

请参阅为什么不推荐使用 auto_ptr?为什么将 std::auto_ptr<> 与标准容器一起使用是错误的

最后,在进行研究之后,我似乎无法找到最适合 boost::ptr_vector 的智能指针?

您可以简单地使用std::vector<std::unique_ptr<x>>or std::vector<std::shared_ptr<x>>boost::ptr_vector在 C++11 AFAIK 中不再使用 for了。

于 2015-08-03T15:13:13.190 回答
3

如果您坚持保留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>>.

于 2015-08-03T15:07:18.723 回答