tgoop.com/cpp_geek/313
Create:
Last Update:
Last Update:
📌 Сегодня расскажу вам о проблеме, которую часто упускают: небезопасный доступ к std::vector по указателю после push_back.
Смотрим код:
std::vector<MyStruct> vec;
vec.reserve(10); // вроде как "гарантируем", что ничего не сломается
MyStruct* ptr = &vec[0];
vec.push_back(MyStruct{});
// BOOM! ptr теперь может быть невалиден
💥 Даже несмотря на
reserve(10)
, контейнер имеет право перераспределить память при любом push_back
, если по каким-то причинам решил, что нужно. Например, при нарушении alignment или внутренней оптимизации.🔒 Что делать безопасно:
* Никогда не храните указатели или ссылки на элементы std::vector, если планируете его изменять.
* Если нужно, используйте индекс:
size_t index = 0;
vec.push_back(...);
use(vec[index]);
* Или используйте std::list / std::deque, если вам действительно нужны устойчивые указатели.
🧠 Это классический источник UB (Undefined Behavior), особенно в старых проектах, где кто-то “оптимизировал” память, сохранив указатель.
Поделитесь, попадались ли вам такие баги? 👇
➡️ @cpp_geek
BY C++ geek
Share with your friend now:
tgoop.com/cpp_geek/313