Как boost::filesystem::directory_entry::path() добавить в const char **

284
17 февраля 2018, 22:49

Доброе время суток. Есть класс, у него есть член

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!";

То всё работает как надо.

Что я упускаю или не знаю, подскажите в чём проблема?

Answer 1

Вызов path().string() может возвращать временную строку, соответственно после выполнения этого выражения она будет разрушена, а сохраненный указатель станет невалидным. Сохраняйте возвращенные строки в векторе:

::std::vector<::std::string> _files_container;
_files_container.emplace_back(itr->path().string());
Answer 2
Правильное решение

Вместо 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() является временным объектов и удаляется по завершении оператора. соответственно когда позже кто-то пытается обратиться по указателю на эту память там уже содержится мусор.

Answer 3

Судя по itr->path().string(), вы обходите циклом директорию и итераторы у вас умирают на каждой итерации, а указатели на их данные повисают. Пытаясь потом прочесть данные из битого указателя, вы получаете случайный вывод.

Вам необходимо скопировать строки к себе в _files_container.

READ ALSO
Табуляция в консоле

Табуляция в консоле

Уже комп виснет от вкладок, а я никак не пойму, как сделать нормальную табуляцию в консолеКод для примера:

264
освобождение памяти с++

освобождение памяти с++

есть функция в ней я выделяю память под массив x, провожу вычисления, далее возвращаю

222
логическая ошибка в операторе функтора

логическая ошибка в операторе функтора

Мне нужно чтобы строка представляла рациональное число произвольной длины, а для этого пытаюсь исключать любой попавший там ненужный символЯ...

207
Создать Java Обновление программы

Создать Java Обновление программы

Всем приветСкажите пожалуйста как сделать обновление программы JavaFX desktop? Делать обновления с Ftp

263