我是c ++和面向对象编程的新手。我的目标是使用void指针指向fstream对象。我有一个包含void指针的结构。我想使用指针引用一个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;
}
编辑:这是OstreamOutputStream和CodedOutputStream的函数原型
OstreamOutputStream (ostream *stream, int block_size=-1);
CodedOutputStream (OstreamOutputStream *output);
代码编译没有错误但我在运行程序时遇到分段错误。文件中也没有任何内容。 任何关于我做错的答案或替代方法的建议都将不胜感激。谢谢。
答案 0 :(得分:0)
在OstreamOutputStream
仍在使用CodedOutputStream
时,您正在删除fstream
。您必须按照创建顺序的相反方式删除对象,以便在其他对象仍在使用时不会删除任何对象。
我怀疑你还有第二个问题:你正在创建{{1}}作为局部变量,这意味着它会在函数返回后立即销毁,使你的指针无效。