используйте указатель void, чтобы указать на объект fstream в c ++

0

Я новичок в c++ и объектно-ориентированном программировании в целом. Моя цель - использовать указатель void для указания на объект fstream. У меня есть структура, которая содержит указатель на пустоту. Я хочу использовать указатель для ссылки на объект fstream, чтобы я мог использовать его в других функциях для записи в файл с использованием API буфера протоколов (SerializeToCodedStream). Я хочу иметь возможность записывать в один и тот же файл с помощью повторных вызовов функций (и читать из него). Кстати, я использую буферы протоколов для сериализации данных и записи в файл.

Моя структура:

    typedef struct Store
    {
      void *Obj;  
    } st;

Мой код для создания объекта fstream и использование указателя для указания на объект

    st *entry1;
    fstream output;
    output.open("file1.txt", ios::out | ios::trunc | ios::binary);
    entry1->Obj=&output;

Здесь я использую указатель

     int addToFile( st *entry)
     {
     OstreamOutputStream *_OstreamOutputStream;
     CodedOutputStream *_CodedOutputStream;

 _OstreamOutputStream = new OstreamOutputStream(entry->Obj);
     _CodedOutputStream = new CodedOutputStream(_OstreamOutputStream);

      file.SerializeToCodedStream(_CodedOutputStream); //file is an object of a protocol buffer class
      delete _OstreamOutputStream; //this line seems to be causing a segmentation fault when i run the program
      delete _CodedOutputStream;
      }

EDIT: вот прототипы функций для OstreamOutputStream и CodedOutputStream

    OstreamOutputStream (ostream *stream, int block_size=-1);
    CodedOutputStream (OstreamOutputStream *output);

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

  • 0
    Ваш класс OstreamOutputStream принимает пустой указатель в конструкторе?
  • 0
    Запустите вашу программу под valgrind или отладчиком, чтобы точно определить ошибку.
Показать ещё 1 комментарий
Теги:
pointers
protocol-buffers

1 ответ

0
Лучший ответ

Вы OstreamOutputStream пока он все еще используется CodedOutputStream. Вы должны удалить объекты в обратном порядке созданного им заказа, чтобы ни один объект не удалялся, пока какой-либо другой объект все еще его использует.

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

  • 0
    Вот и все. Выходными данными была локальная переменная, которая была уничтожена до того, как указатель был использован, в результате чего он стал висящим указателем и, следовательно, ошибкой сегмента. Спасибо за ваш ответ
  • 0
    Объявление вывода как статического, похоже, решило проблему

Ещё вопросы

Сообщество Overcoder
Наверх
Меню