C ++:使用std :: ifstream读取二进制文件后删除缓冲区/指针时的访问冲突

时间:2014-02-18 19:54:07

标签: c++ memory binary fstream

我是C ++的新手,遇到了关于内存和指针管理的问题(我认为)。我试图弄清楚如何编写和读取二进制文件并设法废弃一个示例程序,但是当我尝试使用我自己的结构调整错误时,错误会不断出现。

继承我的代码:

#include "stdafx.h"
#include <fstream>
#include <iostream>

struct Data
{
    std::string name;
    unsigned int age;
};

int _tmain(int argc, _TCHAR* argv[])
{
    /*  Here is the part which I only ran the first time to write the file
    std::ofstream oFile("foo.bin", std::ios::out | std::ios::binary);
    Data data;
    data.name = "Brian";
    data.age = 32;
    oFile.seekp(0);
    oFile.write((char*)&data, sizeof(Data));
    oFile.close();
    */
    std::ifstream iFile("foo.bin", std::ios::in | std::ios::binary);
    Data* buffer = new Data;
    iFile.read((char*)buffer, sizeof(Data));
    iFile.close();
    std::cout << buffer->name.c_str() << std::endl;
    delete buffer;

    return 0;
}

如果忽略缓冲区的已分配空间,程序运行正常,但这会导致内存泄漏吗?如果有人愿意花点时间指出我的代码中的错误,或者如果我的方法有误,请指导我正确的方向,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

这些陈述

iFile.read((char*)buffer, sizeof(Data));
//...
std::cout << buffer->name.c_str() << std::endl;

毫无意义。类std :: string在内部使用一些指向已分配内存的指针。当您读入结构时,数据成员名称具有一些与程序中实际分配的内存不对应的任意值。您读取二进制数据的方法无效。