Изпитвам странен бъг в паметта (segfault). След известен преглед на кода открих, че предавам указател към себе си (this
) към стойност на член вътре в клас, който сам по себе си е във вектор и е на път да промени адреса си. Тогава (евентуално) векторът нараства и указателят, който току-що премина, става невалиден.
Разбирам, че std::vector
трябва да премести съдържанието си в паметта, тъй като е гарантирано, че продължава, нали? Мислех, че мога да преодолея това, като предам const препратка вместо указател (предавайки *this
). Но аз имам същата грешка. Не виждам защо препратките могат да станат невалидни точно както указателите! Ситуацията може да се обобщи така:
class Foo
{
public:
Foo(): x(new Bar(*this)){}
Foo(Foo&&);
Foo& operator=(Foo&&)
private:
// some heavy to move data
Bar* x;
};
class Bar
{
public:
Bar(const Foo& foo): instance(foo){}
private:
const Foo& instance;
};
std::vector<Zoo> vec;
// Do some stuff on vec, then x->instance become invalid. Why?
Zoo
и какво точно правите сvector<Zoo>
? Да, елементът, връщащ кода в нарастващ вектор чрез препратка, може да се взриви при първото преразпределение на вътрешната памет, което се случва във вектора (при размери 0, 1, 2, 4 и т.н. по подразбиране). - person bobah   schedule 31.05.2014std::list
(с линейно време за достъп!) - person sorush-r   schedule 31.05.2014