C ++可能的内存泄漏读取文件

时间:2012-09-12 01:28:40

标签: c++ memory-management file-io

我对C ++比较陌生,我正在尝试阅读专有的文件格式。我知道标题格式,并且我已经创建了一个带有必要字段的结构RTIHeader

我的测试代码从文件中读取字节并将它们复制到与头结构相同的内存空间中,从而有效地重新构造它。我的问题是,每次运行测试代码(只是调用构造函数)时,我都会获得不同的值!我的理论是我不完全理解memcpy

struct RTIHeader decode(char* memblock){
    struct RTIHeader header;
    memcpy(&header,&memblock,sizeof(RTIHeader));
    return header;
}

RTIFile::RTIFile(const char* filename){
    // open the file in binary input mode with the pointer at the end
    std::ifstream file(filename,
                       std::ios::in |
                       std::ios::binary |
                       std::ios::ate);

    std::ifstream::pos_type size;
    char * memblock;
    RTIHeader header;

    // if the file didn't open, throw an error
    if(!file.is_open()){
        //TODO learn about C++ error handling
        return;
    }
    // use pointer position to determine file size
    size = file.tellg();
    // read file
    memblock = new char [sizeof(RTIHeader)];
    file.seekg(0,std::ios::beg);
    file.read(memblock,sizeof(RTIHeader));

    header = decode(memblock);

    std::cout << (unsigned int)header.signature[0] << "\n";

    // still need to read the rest of the file
    file.close();
}

1 个答案:

答案 0 :(得分:2)

您正在传递memblock地址作为memcpy的第二个参数。由于memblock是函数的参数,因此您只需从堆栈中复制内存块。

要修复,只需直接传递指针:

memcpy(&header,memblock,sizeof(RTIHeader));

顺便说一句,由于您按值返回结构,因此您将产生额外的 memcpy,因为返回的值已完全复制(除非您的编译器对其进行优化)。为避免这种情况,您应该考虑将目标结构作为指向decode的指针传递,如

struct RTIHeader *decode(struct RTIHeader *header, char* memblock){
    memcpy(header, memblock, sizeof(RTIHeader));
    return header;
}

然后你只需做

decode(&header, memblock);

效率更高。