C ++程序在向量析构函数中挂起

时间:2017-09-25 14:39:02

标签: c++ c++11 vector destructor

我有一个带有字段的结构,该字段添加了预处理器#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));
}

为什么程序挂在那里?

(编辑问题以清楚显示问题)

1 个答案:

答案 0 :(得分:0)

经过大量调试后我发现了问题。 我在struct中有一个define,它为struct添加了一个额外的成员变量。 当我使用该函数构建一个库并在程序中包含标题时,只在其中一个项目中设置了define。

所以第二个项目删除了for (; _First != _Last; ++_First)循环中的数据,但是数据结构的一个成员比用于分配内存的结构多一个。因此循环跳过实际数据的末尾。然后它得到_Last < _First并且循环不会终止,因为_First仅在循环中增加。