c – std :: string的引用计数

我正在查看basic_string的代码(与g 4.2.1捆绑在一起).复制构造函数使用grab()函数来“获取”字符串的副本(增加其引用计数):

_CharT* _M_grab( const _Alloc& __alloc1, const _Alloc& __alloc2 ) {
  return (!_M_is_leaked() && __alloc1 == __alloc2) ? _M_refcopy() : _M_clone(__alloc1);
}

仅当两个字符串的分配器相同时才会增加引用计数 – 这是有意义的.但是,复制构造函数是:

basic_string(const basic_string& __str)
: _M_dataplus(__str._M_rep()->_M_grab(_Alloc(__str.get_allocator()), __str.get_allocator()),
              __str.get_allocator())
{ }

传递给_M_grab()的第一个分配器是第二个的副本.为什么?如果用户使用自定义分配器,则分配器的运算符==()可能返回false的唯一方法.但是,即使这是真的,你也会认为复制的分配器与原来的分配器相当,对吧?所以:

>为什么要比较分配器?
>为什么要复制构造一个分配器并将副本与原始文件进行比较?
>将副本与原始副本进行比较会返回false的用例是什么?

更新

是的,_M_grab()用于另一个地方:用于分配.在这种情况下,传递给_M_grab()的分配器是不同的.精细.但似乎没有理由同时复制构造,然后在构造函数中比较分配器的字符串.

最佳答案 我知道关于GCC团队的推理的拉链,但这是我的假设:

>用于调试?分配器必须是相同的.
>所以它可以重用_M_grab()?
>永远不应该发生?

点赞