我正在重新学习 C++,我需要使用内存映射文件。我决定使用 boost(因为它似乎是可靠的库)。
我创建了一个映射到 double 组的内存映射文件,并写入该数组中的第一个 double 。磁盘文件的前四个字节包含一些数据,其余部分被清零,这对我来说很好奇,因为如果我在 C++ 中获得指向内存位置的指针,在大多数情况下我必须假设它包含垃圾。
我是否可以保证新创建的内存映射文件将被清零(至少在 Linux 上)?我没有找到任何引用。
BOOST_AUTO_TEST_CASE(OpenMMapFile){
boost::iostreams::mapped_file file;
boost::iostreams::mapped_file_params params;
params.path = "/tmp/mmaptest-1";
params.mode = std::ios::in | std::ios::out;
params.new_file_size = 10*sizeof(double);
file.open(params);
double* data = static_cast<double*>((void*)file.data());
data[0] = 12;
file.close();
}
文件内容如下:
cat /tmp/mmaptest-1 | base64
AAAAAAAAKEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
编辑
正如@Zan 指出的那样——boost 实际上使用 ftruncate 来调整映射文件的大小,因此保证了归零(至少在 Linux 上)。
最佳答案
内存映射文件包含文件中的任何内容。
如果它是一个新文件,它已经扩展到正确的大小并且扩展名将包含零。扩展文件通常使用 ftruncate 函数完成。
ftruncate 联机帮助页说:
If the file previously was larger than this size, the extra data is lost. If the file previously was shorter, it is extended, and the extended part reads as null bytes ('\0').
所以是的,零是有保证的。
关于c++ - boost 内存映射文件是否在 Linux 上归零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22025912/