boost::dynamic_bitset向量初始化后位设置异常问题咨询
问题原因与解决办法
你的问题根源在于:当前的vector初始化方式导致8个boost::dynamic_bitset实例共享了底层的存储缓冲区。
当你使用std::vector<T>(n, value)构造函数时,会用传入的value拷贝构造所有n个元素。而你传入的是一个临时的boost::dynamic_bitset<>(2)对象,boost的dynamic_bitset在处理临时对象的拷贝时,可能启用了引用计数的共享存储优化(部分旧版本实现甚至存在浅拷贝逻辑),导致多个实例共用同一块内存区域——这就解释了修改v[0]的位会影响v[1],且现象不稳定的问题。
解决办法
以下几种方式都能避免共享存储,让每个bitset实例独立:
循环逐个构造:
用emplace_back逐个创建独立的bitset,确保每个实例都有自己的底层存储:std::vector<boost::dynamic_bitset<>> v; v.reserve(8); // 预分配空间提升效率 for (int i = 0; i < 8; ++i) { v.emplace_back(2); }初始化列表显式构造:
直接在初始化列表中逐个构造每个bitset,避免共享:std::vector<boost::dynamic_bitset<>> v = { boost::dynamic_bitset<>(2), boost::dynamic_bitset<>(2), boost::dynamic_bitset<>(2), boost::dynamic_bitset<>(2), boost::dynamic_bitset<>(2), boost::dynamic_bitset<>(2), boost::dynamic_bitset<>(2), boost::dynamic_bitset<>(2) };先创建非临时对象再拷贝:
先构造一个非临时的bitset对象,再用它来填充vector,此时boost会执行深拷贝:boost::dynamic_bitset<> bs(2); std::vector<boost::dynamic_bitset<>> v(8, bs);
内容的提问来源于stack exchange,提问作者HarishMallari
相关产品推荐
相关产品推荐

