Доброе время суток. Есть класс, у него есть член
const char **_files_container;
Если я правильно понимаю, это массив "си строк". В конструкторе я инициализирую этот массив
this->_files_container = new const char*[10];
Таким образом, я могу положить в него 10 штук const char[];
Далее я пользуюсь библиотекой boost::filesystem, шарю по папке и найденные файлы просто хочу в виде текста закинуть в этот самый _files_container
Тут я сталкиваюсь с проблемой:
itr->path().string();
Вернет строку, как и нужно, но типа string, а мне нужно получается const char*;
Хорошо, я умею преобразовать такие разногласия с помощью c_str():
this->_files_container[0] = itr->path().string().c_str();
И вот тут самый затык. Вывожу в консоль cout << this->_files_container[0] << endl; и получаю.. просто графические артефакты какие-то, либо пусто, либо просто буква e.
Если заполнить массив руками, например:
this->_files_container[0] = "Fire in the hole!";
То всё работает как надо.
Что я упускаю или не знаю, подскажите в чём проблема?
Вызов path().string() может возвращать временную строку, соответственно после выполнения этого выражения она будет разрушена, а сохраненный указатель станет невалидным. Сохраняйте возвращенные строки в векторе:
::std::vector<::std::string> _files_container;
_files_container.emplace_back(itr->path().string());
Вместо const char **_files_container; создать std::vector<std::string> _files_container и не мучатся.
Вручную управлять памятью и копировать строки в char[]
std:: string path=itr->path().string();
this->_files_container[0] = new char [path.size()+1];
strcpy( this->_files_container[0], itr->path().string().c_str());
В этом случае кроме всего прочего надо не забыть самостоятельно удалить память, когда она уже не будет нужна.
Почему так происходитСтрока возвращаемая из tr->path().string() является временным объектов и удаляется по завершении оператора. соответственно когда позже кто-то пытается обратиться по указателю на эту память там уже содержится мусор.
Судя по itr->path().string(), вы обходите циклом директорию и итераторы у вас умирают на каждой итерации, а указатели на их данные повисают. Пытаясь потом прочесть данные из битого указателя, вы получаете случайный вывод.
Вам необходимо скопировать строки к себе в _files_container.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости