необходимость выделения памяти из указателя потока - PullRequest
0 голосов
/ 19 марта 2020

В этой программе:

#include<fstream>
#include<iostream>

int main()
{
   std::ofstream *fb;
   (*fb).open("file.txt",std::ios::out);

   std::cout.rdbuf((*fb).rdbuf());

   std::cout<<"Hello World to ALL";

   return 0;
}

При запуске это дает ошибка сегментации - поэтому при изменении *fb на fb помогает, поскольку не было выделено места

Но я не понимаю, почему для объекта ofstream требуется место, которое должно быть выделено, если память, с которой он должен работать (file.txt), уже существует? Разве это не должно быть похоже на способ обработки файлового ввода-вывода на языке C, где для открытия используется указатель FILE, а затем операции выполняются без выделения памяти?

Кроме того, что будет означать выделенная память с использованием указателя ofstream функционально (теоретически)?

1 Ответ

1 голос
/ 19 марта 2020

Ваш код никогда не создает объект std::ofstream. Вы не можете вызвать open для std::ofstream объекта до его создания.

Вы создаете переменную типа для хранения указателя на std::ofstream объект, но на самом деле вы не делаете это указывает на что-нибудь. Поэтому, когда вы вызываете open для объекта, на который он указывает, вы вообще не вызываете open для какого-либо действительного объекта.

Но что я не понимаю, так это почему ofstream объекту требуется пространство для выделения, если память, которая ему требуется для обработки (file.txt), уже существует?

Дело не только в том, что вы не выделяли пространство. Даже если у вас есть место для объекта, он все равно должен быть инициализирован для допустимого содержимого для объекта этого типа. Пространство необходимо для хранения информации о состоянии, например, открыт файл или нет. И он должен содержать действительное содержимое, а не мусор, или он может сказать, что файл открыт, когда его нет.

Разве это не должно быть похоже на способ обработки файлового ввода-вывода в C язык, на котором указатель FILE используется для открытия, а затем операции выполняются без выделения памяти?

Функция fopen выделяет память, делает ее содержимое действительным и возвращает указатель на нее тебе. Затем вы должны быть уверены, что позвоните fclose, чтобы покончить с этим, когда вы закончите. Вы можете написать эквивалентные функции для std::ofstream, если хотите, но тогда вы потеряете преимущества многих функций C ++, таких как RAII.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...