libstdc&x2B中的Bug+;关于std::列表分配? 我最近遇到了一个非常有趣的不一致,而使用LIbxML++(一个用于LIbxML2的C++包装)。
库使用默认的STL列表容器(libstdc&x2B中的Bug+;关于std::列表分配? 我最近遇到了一个非常有趣的不一致,而使用LIbxML++(一个用于LIbxML2的C++包装)。,c++,list,gcc,c++11,std,C++,List,Gcc,C++11,Std,库使用默认的STL列表容器(std::list)返回节点列表。 由于它是从默认存储库安装的,所以它似乎是在C++03模式下构建的(但我正在使用C++11) 这里需要注意的是,C++11改变了std::list::size()的工作方式。 在C++03中,它是O(n),每次调用std::distance(begin(),end()),现在它返回预先计算的值 代码如下: /** Returns the number of elements in the %list. */ size_ty
std::list
)返回节点列表。
由于它是从默认存储库安装的,所以它似乎是在C++03模式下构建的(但我正在使用C++11)
这里需要注意的是,C++11改变了std::list::size()
的工作方式。在C++03中,它是O(n),每次调用
std::distance(begin(),end())
,现在它返回预先计算的值
代码如下:
/** Returns the number of elements in the %list. */
size_type
size() const _GLIBCXX_NOEXCEPT
{
#ifdef __GXX_EXPERIMENTAL_CXX0X__
return this->_M_impl._M_size;
#else
return std::distance(begin(), end());
#endif
}
当我从库中收到这样一个列表并对其调用size()
时,事情就开始发生了。在那个里,我读到了140734320138496这样的值,这清楚地表明了一个未初始化的计数器:在原始列表中,根本并没有计数器。当然,手动调用std::distance(list.begin(),list.end())确实有效
问题是-这可以被认为是GCC/libstdc++中的一个bug,还是我永远不应该链接在不同GCC模式下构建的可执行文件?我认为这违反了一个定义规则。编译代码时使用的
std::list
定义与库使用的定义不同。(这是未定义的行为,不是GCC错误。)
您应该重新编译库(或重新编译代码)