由于一些疯狂,我被迫在全新安装的 Win7 Pro 上升级到 Microsoft Visual Studio 2010 Ultimate。我已将代码简化为结构的基本结构以及一般情况。我听说这可能是 VS2010 在他们的 STL 实现中的一个错误,如果是这样,我正在寻找解决方法。(编辑:我的原始代码在 Visual Studio 2008 中运行良好。)
这是头文件:
#include <iostream>
#include <vector>
using namespace std;
class ChildClass //partition function for each
{
public:
ChildClass();
void Clear(void);
vector<double> childrenvars;
void PrintChildren(void);
//long list of other variables
};
class ParentClass
{
public:
ChildClass variable;
//other variables
ParentClass();
~ParentClass();
};
这是源文件:
#include "source.h"
ChildClass::ChildClass()
{
Clear();
}
void ChildClass::Clear(void)
{
childrenvars.clear();
return;
}
void ChildClass::PrintChildren(void)
{
cout << endl;
for(unsigned int i=0; i<childrenvars.size(); i++)
cout << childrenvars[i] << " ";
}
ParentClass::ParentClass()
{
this->~ParentClass();
}
ParentClass::~ParentClass()
{
this->variable.childrenvars.clear();
}
int main(void)
{
ParentClass* ParVar = new ParentClass[5];
for(unsigned int numiter = 0; numiter < 3; numiter++)
{
for(unsigned int i=0; i<5; i++)
{
for(unsigned int j=0; j<i; j++)
ParVar[i].variable.childrenvars.push_back(j);
ParVar[i].variable.PrintChildren();
}
for(unsigned int i=0; i<5; i++)
ParVar[i].variable.Clear();
}
delete [] ParVar;
int wait;
std::cin >> wait;
return(0);
}
在发行版中编译提供了可预测的功能:
(blank)
0
0 1
0 1 2
0 1 2 3
0
0 1
0 1 2
0 1 2 3
0
0 1
0 1 2
0 1 2 3
在调试模式下编译给出:
(blank)
0
0 1
0 1 2
0 1 2 3
Debug Assertion Failed... vector iterators incompatible.
它在第一次调用.Clear()函数时失败。即使将 clear for 循环更改为从 1,2 等开始,也会发生这种情况。错误似乎是由于 .clear() 调用 .erase(begin(), end()) 而导致的。当向量中没有任何东西并且它已经是空的时,它真的很讨厌它。有趣的是,当清除循环在擦除(const_iterator _First_arg,const_iterator_Last_arg)中从 2 开始时,这是我在 autos 下看到的内容。
_First_arg = 0,正如预期的那样。
_Last_arg = -2.53...e-098
这:
尺寸:2
容量:2
0:0.0000...
1:1.000....
第一个向量开始于:0x002648e8 最后一个向量开始于:0x002648f8(虽然我认为由于 end(),这实际上是最后一个向量之外的一个,这对于 8 字节双精度数是有意义的)。
除了转到预处理器定义并设置 _ITERATOR_DEBUG_LEVEL=0 以关闭这些“功能”(我实际上想知道我是否不小心搞砸了)之外,任何人都对实际原因是什么以及如何解决这个问题有任何想法? 虽然我确实有一些多余的清除,但我不认为这会是这个问题的根源。尤其是考虑到代码甚至从未到达析构函数。
提前致谢!
~丹