【发布时间】:2018-07-14 02:39:43
【问题描述】:
在尝试使用boost::interprocess 将std::vector 存储在内存映射文件中时,当我尝试推回加载的向量时遇到异常Exception thrown: read access violation.,但仅在调试模式下。
这个最小的示例代码(由@sehe 编写)是从https://stackoverflow.com/a/29602884/2741329 检索到的,它在调试模式下在MSVC14 上崩溃并且执行了多次:
#include <boost/interprocess/managed_mapped_file.hpp>
namespace bi = boost::interprocess;
int main() {
std::string vecFile = "vector.dat";
bi::managed_mapped_file file_vec(bi::open_or_create,vecFile.c_str(), 1000);
typedef bi::allocator<int, bi::managed_mapped_file::segment_manager> int_alloc;
typedef std::vector<int, int_alloc> MyVec;
MyVec * vecptr = file_vec.find_or_construct<MyVec>("myvector")(file_vec.get_segment_manager());
vecptr->push_back(rand());
}
编辑:
这是 Visual Studio 错误消息:
这里是异常发生的地方:
这是调用堆栈(点击图片放大):
【问题讨论】:
-
在崩溃时显示堆栈跟踪会很有帮助。
-
@john-zwinck 添加了有关崩溃的更多详细信息。
-
将 C++ 标准模板类型放入共享内存是一项非常冒险的尝试。您对编译器/库版本和构建设置有强烈的依赖性。触发此崩溃的一种简单方法是在一侧使用调试设置构建代码,在另一侧使用发布设置构建代码。它轰炸了实现迭代器调试功能的库代码,它改变了对象布局。 Sayonara 当数据是由关闭迭代器调试的代码生成时。保持简单。
-
bi::allocator不管理mmf上的元素数据分配吗? -
@HansPassant 恕我直言,这是在传播 FUD。我知道您根本不知道 Boost Interprocess 库,但是这里的用法非常好(您对围绕
open_or_create进行比赛有一个有效的直觉,但这显然不是这里的问题,与问题无关)。对于 OP:当我在电脑旁时,我会查看这一层。 (您是否有机会同时运行多个副本?)
标签: c++ visual-studio-2015 memory-mapped-files boost-interprocess