我有以下内容:
#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
?
答案 0 :(得分: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::string
,或者因为你没有使用以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());
}
答案 1 :(得分: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
...
}