Так много вещей, которые используются почти правильно:
bool findOdpWithID(int id, shared_ptr<Odp> shpoutOdp, OdpVec& vec)
Здесь параметр shpoutOdp является копией входного параметра. Не так уж важно, учитывая, что это общий указатель, но, вероятно, это не то, что вы намеревались. Вы, вероятно, хотели бы передать по ссылке, в противном случае зачем передавать его функции.
shpoutOdp.reset();
Сброс параметра при его передаче.
Означает ли это, что он может быть грязным (тогда зачем иметь его в качестве входного параметра), он заставляет функцию возвращать общий указатель в результате, если вы хотите что-то передать.
Odp& odp = *(iter->get());
Не используйте get для общих указателей, если только вам это не нужно (и вам это действительно нужно). Извлечение указателя не является необходимым для получения того, на что указывает указатель, и повышает вероятность ошибок, потому что вы работаете с указателями. Эквивалентная безопасная (r) строка:
Odp& odp = *(*iter); // The first * gets a reference to the shared pointer.
// The second star gets a reference to what the shared
//pointer is pointing at
Здесь все идет не так:
shpoutOdp.reset(iter->get());
Вы создаете новый общий указатель из указателя. К сожалению, указатель уже управляется другим общим указателем. Итак, теперь у вас есть два общих указателя, которые думают, что они владеют указателем и собираются удалить его, когда они выходят из области видимости (первый выходит из области видимости в конце функции, так как это копия входного параметра (скорее чем ссылка)). Правильнее всего сделать задание. Тогда общие указатели знают, что они используют указатель:
shpoutOdp = *iter; // * converts the iterator into a shared pointer reference
Следующая строка, хотя и не совсем неверная, предполагает, что используемые итераторы имеют произвольный доступ (что верно для вектора).
for (OdpVec::iterator iter = vec.begin(); iter < vec.end(); iter++)
Но это делает код более хрупким, так как простое изменение в typedef OdpVec сломает код без предупреждения. Поэтому, чтобы сделать это более совместимым с обычным использованием итератора, используйте! = При проверке end (), а также предпочитайте оператор предварительного увеличения:
for (OdpVec::iterator iter = vec.begin(); iter != vec.end(); ++iter)