c ++ 11 — ссылка на содержимое временных строк c ++

Следующий код работает, и я пытаюсь понять, как.

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

1

Решение

infile.string() возвращает объект типа std::string, А также .c_str() возвращает указатель на некоторое содержимое объекта, поэтому file указатель на содержимое объекта. Но в конце заявления std::string объект и его содержание разрушается. В результате указатель file указывает на никуда, в начале следующего утверждения.

2

Другие решения

C ++ указывает, что привязка временного объекта к ссылке на const в стеке удлиняет время жизни временного объекта до времени жизни самой ссылки, что означает const char * file который лежит в стеке.

Этот механизм C ++ позволяет избежать того, что вы назвали ошибкой висячей ссылки.
В приведенном выше коде временный код действует до закрывающей фигурной скобки вашего процесса processTextFile.

Вы можете проверить это GOTW для получения дополнительной информации.

-2

По вопросам рекламы [email protected]