Проблема в том, что функция path::string()
возвращает строку по значению .
Значение, которое будет уничтожено , как только как выражение p.string().data()
заканчивается.
Это означает, что указатель сразу станет недействительным, и у вас будет неопределенное поведение , когда вы попытаетесь разыменовать его (например, когда печать его).
Очевидное решение состоит в том, чтобы не использовать векторы char*
для строк, а вектор std::string
.
Что касается разницы между использованием p.string().data()
(или p.string().c_str()
) и p.c_str()
, это то, что p.c_str()
возвращает указатель на внутреннюю строку внутри объекта path
, на который ссылается p
. Этот path
объект не будет уничтожен до тех пор, пока вы не закончите clear
вектор или время жизни вектора (и содержащийся в нем объект) (когда вектор разрушен).
Обратите внимание, что если вы Если вы используете oop, например
for (auto p : paths) { ... }
, где p
является копией path
объектов, то у вас будет такая же проблема даже с p.c_str()
, как и у объекта p
закончит свою жизнь и будет уничтожен в конце каждой итерации l oop.