使用void指针指向c ++中的fstream对象

时间:2014-04-06 11:10:29

标签: c++ pointers protocol-buffers

我是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);

代码编译没有错误但我在运行程序时遇到分段错误。文件中也没有任何内容。 任何关于我做错的答案或替代方法的建议都将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:0)

OstreamOutputStream仍在使用CodedOutputStream时,您正在删除fstream。您必须按照创建顺序的相反方式删除对象,以便在其他对象仍在使用时不会删除任何对象。

我怀疑你还有第二个问题:你正在创建{{1}}作为局部变量,这意味着它会在函数返回后立即销毁,使你的指针无效。