Следующий код работает, и я пытаюсь понять, как.
int Process::processTextFile(const boost::filesystem::path& infile)
{
const char *file = infile.string().c_str();
uint16_t num_lines = 0;
.
.
.
FILE *fp;
fp = fopen(file, "r");
.
.
//Use fp for reading and stuff.
}
Из того, что я понимаю infile.string()
создает временные и файловые указатели на содержимое. Момент, когда оператор заканчивается (;), временная строка должна выйти из области видимости, приводя к тому, что файл является висящим указателем.
Я буду использовать строку вместо char*
но все же нужно понять, чего мне не хватает.
Компилятор — gcc 4.8.4
Оптимизация — O3
infile.string()
возвращает объект типа std::string
, А также .c_str()
возвращает указатель на некоторое содержимое объекта, поэтому file
указатель на содержимое объекта. Но в конце заявления std::string
объект и его содержание разрушается. В результате указатель file
указывает на никуда, в начале следующего утверждения.
C ++ указывает, что привязка временного объекта к ссылке на const в стеке удлиняет время жизни временного объекта до времени жизни самой ссылки, что означает const char * file который лежит в стеке.
Этот механизм C ++ позволяет избежать того, что вы назвали ошибкой висячей ссылки.
В приведенном выше коде временный код действует до закрывающей фигурной скобки вашего процесса processTextFile.
Вы можете проверить это GOTW для получения дополнительной информации.