我有一个带有字段的结构,该字段添加了预处理器#define:
struct MyType {
int somedata;
#ifdef HAS_INDEX
int index;
#endif
}
当我向向量添加实例时,程序会在第一次重新分配时挂起:
vector<MyType> myData;
myData.reserve(4);
myData.push_back(MyType{0,0});
myData.push_back(MyType{0,1});
myData.push_back(MyType{0,2});
myData.push_back(MyType{0,3});
myData.push_back(MyType{0,4}); // Program hangs
我之前在线上设置断点,然后逐步完成附加过程。当旧的矢量存储被解除分配时,破坏矢量的函数似乎进入了Microsoft Visual Studio 2015编译器的xmemory0的无限循环:
// TEMPLATE FUNCTION _Destroy_range WITH ALLOC
template<class _Alloc,
class _Ptr = typename _Wrap_alloc<_Alloc>::pointer> inline
void _Destroy_range1(_Ptr _First, _Ptr _Last, _Wrap_alloc<_Alloc>& _Al, false_type)
{ // destroy [_First, _Last), no special optimization
for (; _First != _Last; ++_First) // <----- infinite loop here with _First > _Last
_Al.destroy(_Unfancy(_First));
}
为什么程序挂在那里?
(编辑问题以清楚显示问题)
答案 0 :(得分:0)
经过大量调试后我发现了问题。 我在struct中有一个define,它为struct添加了一个额外的成员变量。 当我使用该函数构建一个库并在程序中包含标题时,只在其中一个项目中设置了define。
所以第二个项目删除了for (; _First != _Last; ++_First)
循环中的数据,但是数据结构的一个成员比用于分配内存的结构多一个。因此循环跳过实际数据的末尾。然后它得到_Last < _First
并且循环不会终止,因为_First
仅在循环中增加。