Ссылка на содержимое временных строк 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

2 ответа

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

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

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

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

Другие вопросы по тегам