I was creating a vector of my bitpacked vectors, called xor_funcs, using the length and value constructor for vector. This is the test that failed:
TEST(vectorInit, size3) {
    const xor_func temp{false, {0,0,0}};
    vector<xor_func> arr{3, temp};
    for(xor_func& f : arr) {
        EXPECT_EQ(3, f.size()) << f;
    }
    for(int i = 0; i < 3; i++) {
        ASSERT_EQ(3, arr[i].size()) << "for i=" << i;
        arr[i].set(i);
    }
}
It seems that the size() call is accessing uninitialized memory, for vectors of length 3 or more, but not ones of size 2.  Valgrind confirms that the memory is not recently stack'd, malloc'd or free'd.
The xor_func is defined as such:
class xor_func {
    private:
        boost::dynamic_bitset<> bitset;
        bool negated;
    public:
        xor_func(const bool neg, const std::initializer_list<int> lst); 
        // That's defined in cpp
        xor_func(const size_t size) : bitset(size), negated(false) {}
        // Disallow the trivial constructor, since I don't want
        // any 0 length xor_funcs existing by default.
        // xor_func() : bitset(), negated(false) {}
        xor_func(const bool negated, const boost::dynamic_bitset<> bitset)
            : bitset(bitset), negated(negated) {}
        // That's all the constructors.
        // Snip
}
I didn't do anything with the default copy and move constructors.
What is going on, and why does my test fail?
 
    