Копировать конструктор не вызывается при использовании boost :: bind, boost :: shared_ptr и boost :: thread - PullRequest
1 голос
/ 06 декабря 2010

Я создаю новый boost::thread с использованием boost::bind и сохраняю его в boost::shared_ptr.
Я передаю функцию и аргумент boost::thread, но когда поток запускается, он неправильно вызывает конструктор копирования для аргумента функции.

Метод создания потока, который я использую, является очень распространенным паттерном Boost, поэтому я не думаю, что в этом проблема:

void myclass::myfunc() {
   Workflow wfOriginal;
   boost::shared_ptr<boost::thread>(
       new boost::thread(boost::bind(&myclass::anotherfunc, this, wfOriginal)));
}
// ...
void myclass::anotherfunc(Workflow wfCopied) {
   // Doing something
}

Я пытаюсь скопировать Workflow из myfunc() в anotherfunc().
Workflow содержит коллекцию, поэтому я предоставил конструктор копирования, который копирует элементы из существующей коллекции в новую Workflow.

К сожалению, когда новый поток вызывает anotherfunc(), коллекция внутри wfCopied пуста!
Я могу сказать, что объект Workflow был частично скопирован, потому что другие элементы, такие как строки и целые, были скопированы, а элементы в коллекции - нет.

Я проверил правильность работы конструктора копирования, проверив его с помощью следующего кода:

Workflow wf;
// ... insert some elements into wf...
Workflow wf1 = wf;
// wf1 has the same elements

Хочу подчеркнуть, что мои тесты показали, что конструктор копирования Workflow работает нормально.
Но для полноты, вот конструктор копирования для Workflow:

Workflow::Workflow(const Workflow& workflow) {
    this->_id = workflow._id;
    (this->_tasks).clear();
    Workflow::TaskCollectionConstIterator it;
    for (it = (this->_tasks).begin(); it < (this->_tasks).end(); it++)
        (this->_tasks).push_back(*it);
}

Кто-нибудь может мне помочь?

Ответы [ 2 ]

2 голосов
/ 06 декабря 2010

Кажется, ваш конструктор копирования имеет недостатки.Вы копируете из вашего пустого вектора в ваш вектор.В результате ничего не копируется.

Я думаю, вы имеете в виду:

for (it = (workflow->_tasks).begin(); it < (workflow->_tasks).end(); it++)
    (this->_tasks).push_back(*it);
0 голосов
/ 06 декабря 2010

Знаете ли вы, что такое список инициализации конструктора?И почему именно вы очищаете контейнер в конструкторе?

Workflow::Workflow(const Workflow& workflow): _id(workflow._id),
    _tasks(workflow._tasks.begin(), workflow._tasks.end()) 
{}
...