У меня странная ошибка памяти (segfault). После некоторого обзора кода я обнаружил, что передаю указатель на self (this
) на значение члена внутри класса, который сам находится внутри вектора и вот-вот изменит свой адрес. Затем (возможно) вектор растет, и только что переданный указатель становится недействительным.
Насколько я понимаю, std::vector
должен перемещать свое содержимое в память, поскольку оно гарантированно продолжается, верно? Я думал, что смогу преодолеть это, передав ссылку на константу вместо указателя (передав *this
). Но у меня такой же segfault. Я не понимаю, почему ссылки могут стать недействительными, как и указатели! Ситуацию можно обобщить так:
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