По сути, вы вызываете неопределенное поведение, потому что sampler.poss_it
является итератором объекта std::vector<int*>
, который был уничтожен до выполнения второго assert
.
Проблема была в строке:
Sampler(std::vector<int*> poss) : poss(poss), poss_it(poss.begin())
, где первый poss
из poss(poss)
относится к poss
члену Sampler
объекта, второй poss
из poss(poss)
относится к параметру poss
, а poss
значение poss_it(poss.begin())
снова относится к параметру poss
( не элемент poss
).Параметр poss
выходит из области видимости в конце конструктора, поэтому параметр poss
уничтожается, что означает, что итератор poss_it
больше не действителен.
Чтобы избежать проблем такого типа,Программисты C ++ почти всегда избегают теневых переменных.Кроме того, конструктор копирования, вероятно, должен принимать константную ссылку (чтобы избежать передачи по значению для потенциально больших объектов):
Sampler(const std::vector<int*>& poss_) : poss(poss_), poss_it(poss.begin())