当场对象创建与变量声明

开心果

我有以下代码(将字符串拆分为向量),使我在for_each循环的第二次迭代中出现段错误:

std::string command = "Something something something";
std::sregex_token_iterator splitter {command.begin(), command.end(), std::regex{"\\s+"}, -1};
std::sregex_token_iterator splitter_end;
std::for_each(splitter, splitter_end, [&](std::ssub_match sm) {
    cmd.push_back(sm.str());
});

为了了解发生了什么,我将正则表达式的声明作为一个命名变量分离出来,它开始起作用:

std::string command = "Something something something";
std::regex rx {"\\s+"};
std::sregex_token_iterator splitter {command.begin(), command.end(), rx, -1};
std::sregex_token_iterator splitter_end;
std::for_each(splitter, splitter_end, [&](std::ssub_match sm) {
    cmd.push_back(sm.str());
});

谁能向我解释一下?

杰弗里·托马斯(Jeffery Thomas)

我知道答案,但我不喜欢它。我认为这可能是clang的缺陷。

std::sregex_token_iterator 正在保存指向正则表达式的指针。

在第一个版本中,匿名std::regex对象在splitter构造之后销毁这样就可以splitter指向内存中已释放的空间。

在第二个版本中,rx将生存到该块的末尾。这样就可以splitter指向正确的对象。


std::regex_token_iterator 构造函数

template <class _BidirectionalIterator, class _CharT, class _Traits>
regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
                     const regex_type& __re, int __submatch,
                     regex_constants::match_flag_type __m)
: __position_(__a, __b, __re, __m),
_N_(0),
__subs_(1, __submatch)
{
    __init(__a, __b);
}

__position_类型的构造std::regex_iterator

template <class _BidirectionalIterator, class _CharT, class _Traits>
regex_iterator<_BidirectionalIterator, _CharT, _Traits>::
regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
               const regex_type& __re, regex_constants::match_flag_type __m)
: __begin_(__a),
__end_(__b),
__pregex_(&__re),
__flags_(__m)
{
    _VSTD::regex_search(__begin_, __end_, __match_, *__pregex_, __flags_);
}

这将__reas的地址存储在指针中。一旦__re超出范围,__re销毁__position_就留下一个悬空的指针。


最后说明

以下作品:

std::string command = "Something something something";
std::for_each(std::sregex_token_iterator{command.begin(), command.end(), std::regex{"\\s+"}, -1},
              std::sregex_token_iterator{},
              [&](std::ssub_match sm) {
    cmd.push_back(sm.str());
});

这是因为std::regex匿名std::sregex_token_iterator对象的生存期与匿名对象相同

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

当场对象创建与变量声明

来自分类Dev

变量声明,它是否创建对实际对象或副本的引用?

来自分类Dev

extern变量声明是否还声明(对象)实体?

来自分类Dev

变量对象中的函数声明

来自分类Dev

无法在我的 C# 脚本中在 monodevelop unity 中创建或声明游戏对象变量

来自分类Dev

创建对象类型的变量

来自分类Dev

动态创建对象的变量

来自分类Dev

创建类变量的对象

来自分类Dev

优化的变量声明基元与空对象

来自分类Dev

使用声明的变量创建数据框

来自分类Dev

使用先前声明的变量创建列表

来自分类Dev

C ++中的对象创建和成员声明

来自分类Dev

包含未声明变量作为值的对象变量

来自分类Dev

为什么要声明/创建一个单独的变量以通过引用进行调用,而不只是在函数调用中创建一个自动对象?

来自分类Dev

使用内联对象方法调用与声明新变量

来自分类Dev

我可以预先声明变量以破坏对象分配吗?

来自分类Dev

在构造函数的默认构造对象中未声明变量

来自分类Dev

Powershell变量与CSV对象一起声明

来自分类Dev

声明字符串变量时对象必填错误

来自分类Dev

使用内联对象方法调用与声明新变量

来自分类Dev

Javascript对象上下文未声明的变量

来自分类Dev

获取对象的类类型并在变量声明中使用它

来自分类Dev

如何在 Julia 对象中声明变量的类型?

来自分类Dev

如何在javascript中的对象声明中使用变量

来自分类Dev

未声明的对象变量显示未定义而不是 ReferenceError

来自分类Dev

找不到符号变量... V 扩展类中声明的对象

来自分类Dev

javascript 对象方法如何引用尚未声明的变量?

来自分类Dev

将结构指针对象/变量声明为外部

来自分类Dev

一个变量声明创建多个实例

Related 相关文章

  1. 1

    当场对象创建与变量声明

  2. 2

    变量声明,它是否创建对实际对象或副本的引用?

  3. 3

    extern变量声明是否还声明(对象)实体?

  4. 4

    变量对象中的函数声明

  5. 5

    无法在我的 C# 脚本中在 monodevelop unity 中创建或声明游戏对象变量

  6. 6

    创建对象类型的变量

  7. 7

    动态创建对象的变量

  8. 8

    创建类变量的对象

  9. 9

    优化的变量声明基元与空对象

  10. 10

    使用声明的变量创建数据框

  11. 11

    使用先前声明的变量创建列表

  12. 12

    C ++中的对象创建和成员声明

  13. 13

    包含未声明变量作为值的对象变量

  14. 14

    为什么要声明/创建一个单独的变量以通过引用进行调用,而不只是在函数调用中创建一个自动对象?

  15. 15

    使用内联对象方法调用与声明新变量

  16. 16

    我可以预先声明变量以破坏对象分配吗?

  17. 17

    在构造函数的默认构造对象中未声明变量

  18. 18

    Powershell变量与CSV对象一起声明

  19. 19

    声明字符串变量时对象必填错误

  20. 20

    使用内联对象方法调用与声明新变量

  21. 21

    Javascript对象上下文未声明的变量

  22. 22

    获取对象的类类型并在变量声明中使用它

  23. 23

    如何在 Julia 对象中声明变量的类型?

  24. 24

    如何在javascript中的对象声明中使用变量

  25. 25

    未声明的对象变量显示未定义而不是 ReferenceError

  26. 26

    找不到符号变量... V 扩展类中声明的对象

  27. 27

    javascript 对象方法如何引用尚未声明的变量?

  28. 28

    将结构指针对象/变量声明为外部

  29. 29

    一个变量声明创建多个实例

热门标签

归档