0

我有以下内容:

#include <boost\interprocess\mapped_region.hpp>
#include <boost\interprocess\file_mapping.hpp>

using namespace std;

void GetFileContents(const char* FilePath, size_t& size, char* data);

int main(){
    char* data = 0;
    const char* FilePath = "My\\Path\\File";
    size_t size = 0;
    GetFileContents(FilePath, size, data);
    //Now data is incorrect
    return 1;
}

void GetFileContents(const char* FilePath, size_t& size, char* data){
    file_mapping fm(FilePath, read_only);
    mapped_region region(fm, read_only);
    data = static_cast<char*>(region.get_address());
    //data is correct here
    size = region.get_size();
}

GetFileContents()data包含正确的信息。但是,data从 () 返回后,GetFileContents它不包含任何内容。我究竟做错了什么?

另外,有没有办法去掉static_cast

4

2 回答 2

1

在这个函数中:

void GetFileContents(const char* FilePath, size_t& size, char* data){
    file_mapping fm(FilePath, read_only);
    mapped_region region(fm, read_only);
    data = static_cast<char*>(region.get_address());
    ...
}

fm并且region是具有自动存储持续时间的对象,其生命周期在执行超出范围时结束。在这些对象被破坏后使用它们的内部会产生未定义的行为

另一个问题是您实际上是在尝试更改指针本身,这意味着您的函数应该采用char** dataPtr并且您应该调用GetFileContents(FilePath, size, &data);.

但是由于您使用的是 C++,因此您应该考虑使用std::stringor ,因为您不使用以 null 结尾的字符串,std::vector<char>因此可能更合适:

void GetFileContents(const char* FilePath, std::vector<char>& content){
    file_mapping fm(FilePath, read_only);
    mapped_region region(fm, read_only);
    content.resize(region.get_size());
    char* src = static_cast<char*>(region.get_address());
    memcpy(&content[0], src, content.size());
}
于 2013-09-14T00:33:44.973 回答
1

那时数据正确的唯一原因是因为它现在指向 region.get_address() 指向的任何内容。当 GetFileContents() 返回时, fm 和 region 被销毁,因为它们失去了作用域。

您需要做的是将数据从 region.get_address() 复制到数据中。

size = region.get_size()
memcpy(data, region.get_address(), size)

不过,在此之前,您需要预先分配数据(例如在 main 中)或以某种方式返回数据(实际返回或通过引用/指针传递)并在 GetFileContents() 中分配它。

假设您在调用 GetFileContents 之前已将数据分配给 size_t 大小,您可以这样做:

char* GetFileContents(...) {
  ...
  memcpy(data, region.get_address(), size)
  size = region.get_size()
  ...
  return data
}


int main() {
  ...
  size_t fileSize = 1024; //maximum size
  char* data = new char[fileSize];
  GetFileContents("file.dat", fileSize, data)
  // now fileSize is the real file size
  ...
}
于 2013-09-14T00:33:52.580 回答