自定义range同时使用std::views::join与enumerate时异常
问题:std::views::join与enumerate组合使用时出现未初始化值问题
我实现了一个简单的SequencesRange类,用于迭代生成固定长度的随机基因组序列。单独使用std::views::join拼接所有序列字符时运行正常,但一旦配合std::views::enumerate使用,就会输出垃圾数据,且valgrind检测到“Conditional jump or move depends on uninitialised value(s)”(条件跳转或移动依赖于未初始化值)的问题。
异常现象细节
- 当可迭代对象的序列长度配置为>=16时,不会出现错误,推测这可能与C++字符串的短字符串优化(SSO)机制有关。
后续测试发现
- 使用整数哨点的简化迭代器结构时,无此问题;
- 若修改迭代器的
operator*使其返回副本(即value_type operator* () const { return value_; }),问题也能解决,但无法理解为何仅使用join时返回引用即可正常工作,结合enumerate却必须返回副本。
代码示例
#include <string> #include <iostream> #include <ranges> class SequencesRange { public: struct iterator { using iterator_category = std::forward_iterator_tag; using value_type = std::string; using difference_type = long; using pointer = value_type*; using reference = value_type const&; iterator (size_t size, size_t nbItems) : value_(size,' '), nbItems_(nbItems) { next(); } iterator() = default; iterator(iterator const&) = default; iterator(iterator && ) = default; iterator& operator= (iterator const&) = default; iterator& operator= (iterator &&) = default; bool operator!= (const iterator& other) const { return nbItems_ != other.nbItems_; } bool operator== (const iterator& other) const { return nbItems_ == other.nbItems_; } iterator& operator++ () { next(); ++nbItems_; return *this; } iterator operator++(int) { iterator tmp = *this; ++(*this); return tmp; } reference operator* () const { return value_; } value_type value_; size_t nbItems_ = 0; void next() { static std::array<char,4> letters = {'A','C','G','T'}; for (auto& c : value_) { c = letters[rand()%letters.size()]; } } }; public: iterator begin() const { return iterator(size, 0); } iterator end () const { return iterator(size, nbItems); } size_t nbItems = 0; size_t size = 0; }; int main (int argc, char** argv) { SequencesRange iterable {1, 10}; // 长度为10的单个序列 for (auto [i,nt] : iterable | std::views::join | std::views::enumerate) { std::cout << nt; // 此处输出垃圾数据 } // 注意以下代码运行正常: // for (auto nt : iterable | std::views::join) { std::cout << nt; } }
内容的提问来源于stack exchange,提问作者abcdefg
相关产品推荐
相关产品推荐

