약간의 고민으로 인해 Win7 Pro를 새로 설치하면 Microsoft Visual Studio 2010 Ultimate로 업그레이드해야합니다. 필자는 코드를 구조체의 뼈와 일반적으로 진행되고있는 부분으로 축소했습니다. 나는 이것이 STL 구현에서 VS2010의 버그 일 수 있다고 들었습니다. 그렇다면 해결 방법을 찾고 있습니다.vector.clear() 중 Visual Studio 2010, C++, "vector iterators Incompatible"
#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();
};
그리고 여기에 소스 파일입니다 :
여기에 헤더 파일입니다 : (EDIT 내 원래의 코드는 비주얼 스튜디오 2008에서 잘 작동) 릴리스에서 컴파일
#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() 함수를 호출하는 데 실패했습니다. 이 오류는 .clease()가 .erase (begin(), end())를 호출 할 때 발생하는 것으로 보입니다. 벡터에 아무것도 들어 있지 않고 이미 비어있는 경우에는 정말 싫어합니다. 흥미롭게도, 여기 클리어 루프가 지우기 (const_iterator _First_arg, const_iterator_Last_arg)에서 2시에 시작될 때 자동차 아래에 표시되는 내용이 있습니다.
예상대로 _First_arg = 0입니다.
_Last_arg = -2.53 ... E-098
이 :
크기 : 2
용량 : 2
0 : 0.0000 ...
1 : 1.000 ....
첫 번째 벡터는 다음에서 시작합니다. 0x002648e8 마지막 벡터는 다음과 같이 시작합니다 : 0x002648f8 (end()로 인해 실제로는 8 바이트 double에서 의미가있는 마지막 것 이상입니다).
전 처리기 정의로 이동하고 _ITERATOR_DEBUG_LEVEL = 0으로 설정하여 이러한 "기능"을 해제하십시오 (실제로 실수로 실수를했는지 알고 싶습니다.). 아무도 실제 원인이 무엇인지에 대한 아이디어가 없습니다. 이 문제를 해결하는 방법? 내가 거기에 몇 가지 여분의 클리어를 가지고 있지만, 나는 그것이이 문제의 원천이 될 것이라고 상상하지 않습니다. 특히 코드가 처음에는 소멸자에게 도달하지 않는다고 생각하면됩니다.
미리 감사드립니다.
~ 댄
이 코드에서는 의미가 없습니다. 실제 코드에서 나는 생성자와 소멸자에 대해 동일한 것을 반복해서 쓰는 것을 발견했다. 필자는 항상 안전성을 위해 zero/null을 사용했으며 트랙 패드로 붙여 넣기 복사 대신 함수 호출을 입력하는 것이 더 쉬울 것이라고 생각했습니다. 실패. 하지만 예 ...이 샘플 문제가 해결되었습니다. 나는 그것이 나의 연구를 위해 모든 것을 고치는지를 알아봐야 할 것이다! 나는 낙관적 인 느낌입니다. 고마워요. 나는 며칠 동안 내 머리를 두드리고있다. –
절대 절대로 소멸자를 부르지 마십시오. 그것은 당신이 말한 것처럼 "데이터를 지우지"않습니다, 그것을 파괴합니다 *. 객체를 삭제하고 메모리를 지우며 포인터를 무효화합니다. 당신이 소멸자를 스스로 호출 할 수있는 유일한 이유는 새로운 곳의 경우입니다. C++의 기본 사항을 읽어야합니다. "재설정"이라고하는 별도의 함수를 만들거나 객체를 소프트 리셋하여 사용 가능한 상태로 남겨 두어야합니다. –