C 程序悬挂在矢量驱动器中

C++ program hangs in vector destructor

本文关键字:驱动器 程序      更新时间:2023-10-16

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

为什么该程序悬挂在那里?

(为清晰显示问题的问题)

我在大量调试后发现了问题。我在结构中有一个定义,该结构为结构增加了一个其他成员变量。当我构建具有该功能的库并在程序中包含标头时,该定义仅设置在其中一个项目中。

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