Доступ к std :: vector, содержащему boost :: shared_ptr <CustomObj>->, возвращает ли at () копию общего указателя? - PullRequest
0 голосов
/ 04 марта 2011

Я новичок в boost :: shared_ptr, используя его в первый раз.У меня есть std :: vector, содержащий boost :: shared_ptr, который я «заполнил» объектами, созданными из пользовательского класса.

В коде: std::vector<boost::shared_ptr<Foo>> data;

Вектор создается внутри функциив стеке.Я хочу получить доступ к некоторым элементам внутри моего вектора, используя vector.at (k).Восстановленный shared_ptr будет отправлен в другой поток, назовем его T1.Мой вектор выходит из области видимости, пока T1 все еще обрабатывает shared_ptr.

В коде:

void myFunction(){</p> <pre><code> //lets get my object boost::shared_ptr<Foo> obj = data.at(k); //emit it to Thread T1 (i am using QT) emit sendObjToThread1(obj);

}

Раньше я думал, что это не вызовет никаких проблем, но поскольку моя программа работает оченьстранно, я собираюсь изменить свое мнение.:) Чтобы прояснить это, я прошу вас на этой платформе сейчас.:)

Правильно ли, что мой объект будет уничтожен, если мой вектор выйдет из области видимости?Если да, то как мне получить глубокую копию shared_ptr (но не объект, который он содержит).Просто чтобы упомянуть это: мое приложение основано на QT.

Thx для чтения.

Ответы [ 3 ]

2 голосов
/ 04 марта 2011

Нет. Возвращает ссылку.

boost::shared_ptr<Foo> obj = data.at(k);

Но в этом утверждении вы делаете копию, создавая объект.

boost::shared_ptr<Foo>& obj = data.at(k);
                     ^^^

Теперь копии не сделаны.

Edit:

А как насчет этой строки?

sendObjToThread1(obj);

Вы передаете быть ссылкой или ценностью? Если вы перейдете по ссылке на другой поток, то это будет проблемой, поскольку локальная копия obj собирается умереть (как только функция вернется). Поэтому вы должны передать obj по значению, чтобы убедиться, что другой поток имеет свою собственную копию и соответствующим образом увеличивает счетчик shared_pointer.

2 голосов
/ 04 марта 2011

См. Один из документов для std::vector<T>::at(). Возвращает ссылку. Пока ваш emit sendObjToThread1(obj); делает копию shared_ptr, вы в безопасности.

0 голосов
/ 05 марта 2011

Я думаю, что вы используете темы.Перейдите , прочитайте это и перепроверьте все, что связано с безопасностью потоков.Убедитесь, что вы используете либо pthreads, либо реализацию без блокировки.

...