Я новичок в 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);
Код компилируется без ошибок, но при выполнении программы я получаю ошибку сегментации. В файл ничего не записывается. Любые ответы на то, что я делаю неправильно или предложения альтернативных методов, будут высоко оценены. Спасибо.
Вы OstreamOutputStream
пока он все еще используется CodedOutputStream
. Вы должны удалить объекты в обратном порядке созданного им заказа, чтобы ни один объект не удалялся, пока какой-либо другой объект все еще его использует.
Я подозреваю, что у вас также есть вторая проблема: вы создаете fstream
как локальную переменную, что означает, что она будет уничтожена, как только функция вернется, что сделает ваш указатель недействительным.