1

我有以下代码:

void f(){
  .....
  std::vector<PrepareLogFileThread> v;

  for(int i = 0; i < list.length(); ++i){

    PrepareLogFileThread a(  
                list[i],
                LOG_TEMPLATE);
    a.start();
    v.push_back( a );
  }
  ....
}

PrepareLogFileThread继承自使用的Threadpthread(我们使用 c++98 标准....,我可以使用auto_ptr)。

这里的问题是Thread' 的复制构造函数是私有的,因此不会弄乱执行或其他东西(我不是这个类的作者)。

这里的想法是我创建我的PrepareLogFileThread对象push_backv启动它们,然后它们都在f返回之前完成。

PrepareLogFileThread有析构函数调用,pthread_join以便它在那里完成。

但我不能,因为我复制a符合push_back.

Thread如果没有 c++11 和更改的复制构造函数,我怎么能做到这一点?

我正在使用 gcc 4.4.6,我可以使用auto_ptr.

4

2 回答 2

1

您可以存储指向对象的指针。

std::vector<PrepareLogFileThread*> v;  

您应该注意对象的生命周期。

于 2015-03-05T10:26:55.713 回答
1

标准容器假定它们的元素支持值语义(用你的话说,包括“可复制”——除其他外)。

一种选择是创建您自己的不需要这种语义的容器。由于各种原因,这很困难。

或者,让您的容器元素成为具有值语义的其他东西,其中值唯一地标识您的 PrepareLogFileThread类的实例。这种“东西”的一个明显选择是指针。例如;

void f()
{
    std::vector<PrepareLogFileThread *> v;

    for(int i = 0; i < list.length(); ++i){

    PrepareLogFileThread *a = new PrepareLogFileThread(  
                list[i],
                LOG_TEMPLATE);
    a->start();
    v.push_back( a );
  }
}

但是请记住,有必要在 vectorv不再存在之前删除它的元素 - 使用 operator 创建的对象在new完成后不会自动销毁。不这样做会导致内存泄漏。

另请注意,std::auto_ptr它不支持值语义,因此不应存储在标准容器中。

于 2015-03-05T10:31:30.550 回答