返回内存映射文件后,数据将丢失

时间:2014-01-06 17:43:22

标签: c++ memory-mapped-files

当我返回指向我的内存映射文件的指针或者在结构中返回我的文件时,数据在函数范围之外丢失。我的功能应该返回什么。

#include <iostream>
#include <fstream>
#include <boost/iostreams/device/mapped_file.hpp>
using namespace std;
using namespace boost::iostreams;

struct data
{
public:

    long long timestamp;
    double number1;
    double number2;
};
int fileSize(ifstream &stream){
    stream.seekg(0, ios_base::end);
    return stream.tellg();
}

mapped_file_source * getData(const string& fin){
    ifstream  ifs(fin, ios::binary);
    mapped_file_source file;
    int numberOfBytes = fileSize(ifs);
    file.open(fin, numberOfBytes);

    // Check if file was successfully opened
    if (file.is_open()) {
        return &file;
    }
    else {
        throw - 1;
    }
}

int main()
{
    mapped_file_source * file = getData("data/bin/2013/6/2/AUD_USD.bin");
    struct data* raw = (struct data*) file->data();
    cout << raw->timestamp;
}

2 个答案:

答案 0 :(得分:5)

您无法返回指向本地堆栈对象的指针。您的编译器应该发出警告。函数完成后,堆栈中的对象将丢失范围,被销毁并且指针无效。

您需要通过使用new创建变量来将变量放在堆上,或者您需要复制(尽管我不确定该类是否可以复制)。

答案 1 :(得分:3)

在您的函数getData()

在堆栈上分配变量file

mapped_file_source file;

这意味着该对象在函数范围的末尾自动销毁。

但是你用这一行返回这个对象的地址:

return &file;

您应该使用关键字file

在堆上分配new
mapped_file_source * file = new mapped_file_source() ;

并且当您不再需要该对象时,请不要忘记在delete函数中使用关键字main()手动删除它。

delete file;