gpt4 book ai didi

c++ - Visual Studio 2010,C++,vector.clear() 期间的 "vector iterators Incompatible"

转载 作者:行者123 更新时间:2023-11-30 03:02:29 25 4
gpt4 key购买 nike

由于一些疯狂的原因,我被迫在全新安装的 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

在 Debug模式下编译给出:

(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()) 而导致的。当 vector 中没有任何内容并且它已经是空的时,它真的很讨厌它。有趣的是,这是我在删除(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....

第一个 vector 开始于:0x002648e8最后一个 vector 开始于:0x002648f8(虽然我认为由于 end(),这实际上是最后一个 vector 之后的一个 vector ,这对于 8 字节 double 是有意义的)。

除了转到预处理器定义并设置 _ITERATOR_DEBUG_LEVEL=0 以关闭这些“功能”(我实际上想知道我是否不小心搞砸了),任何人都知道实际原因是什么以及如何解决这个问题?虽然我确实在那里有一些多余的清除,但我不认为这会是这个问题的根源。特别是考虑到代码甚至从来没有到达过析构函数。

提前致谢!

~丹

最佳答案

ParentClass::ParentClass()
{
this->~ParentClass();
}

析构函数不是一个普通的函数,它是一个特殊的函数。如果你在一个对象上调用析构函数,它就会被完全销毁,包括它的所有基类和成员。在这里,您要在 ParentClass 对象完全构建之前将其销毁。任何使用该对象的尝试都可能导致问题,例如您看到的错误消息所标记的问题。

如果你想在析构函数和另一个函数之间共享代码,你应该将代码放在一个单独的函数中,并从析构函数和另一个函数中调用它。在几乎所有应用程序代码中,您永远不需要显式调用析构函数。

std::vector 默认构造为空,并在销毁时清理,因此 ChildClass 构造函数和 ParentClass 构造函数和析构函数都是在您的示例中是多余的,可以省略。

关于c++ - Visual Studio 2010,C++,vector.clear() 期间的 "vector iterators Incompatible",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10116132/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com