1

약간의 고민으로 인해 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으로 설정하여 이러한 "기능"을 해제하십시오 (실제로 실수로 실수를했는지 알고 싶습니다.). 아무도 실제 원인이 무엇인지에 대한 아이디어가 없습니다. 이 문제를 해결하는 방법? 내가 거기에 몇 가지 여분의 클리어를 가지고 있지만, 나는 그것이이 문제의 원천이 될 것이라고 상상하지 않습니다. 특히 코드가 처음에는 소멸자에게 도달하지 않는다고 생각하면됩니다.

미리 감사드립니다.

~ 댄

답변

1

의도가 여기에있다,하지만 당신은 this->~ParentClass();를 제거하면 작동 무엇인지 확실하지.

+0

이 코드에서는 의미가 없습니다. 실제 코드에서 나는 생성자와 소멸자에 대해 동일한 것을 반복해서 쓰는 것을 발견했다. 필자는 항상 안전성을 위해 zero/null을 사용했으며 트랙 패드로 붙여 넣기 복사 대신 함수 호출을 입력하는 것이 더 쉬울 것이라고 생각했습니다. 실패. 하지만 예 ...이 샘플 문제가 해결되었습니다. 나는 그것이 나의 연구를 위해 모든 것을 고치는지를 알아봐야 할 것이다! 나는 낙관적 인 느낌입니다. 고마워요. 나는 며칠 동안 내 머리를 두드리고있다. –

+2

절대 절대로 소멸자를 부르지 마십시오. 그것은 당신이 말한 것처럼 "데이터를 지우지"않습니다, 그것을 파괴합니다 *. 객체를 삭제하고 메모리를 지우며 포인터를 무효화합니다. 당신이 소멸자를 스스로 호출 할 수있는 유일한 이유는 새로운 곳의 경우입니다. C++의 기본 사항을 읽어야합니다. "재설정"이라고하는 별도의 함수를 만들거나 객체를 소프트 리셋하여 사용 가능한 상태로 남겨 두어야합니다. –

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

소멸자는 일반적인 기능이 아니며 특별한 기능입니다. 객체에 소멸자를 호출하면 해당 소멸자가 모든 기본 및 멤버를 포함하여 완전히 파괴됩니다. 여기서 완전히 완성되기 전에 ParentClass 객체를 파괴하고 있습니다.개체를 사용하려는 시도는 사용자가 보는 오류 메시지로 플래그가 지정된 것과 같은 문제를 일으킬 수 있습니다.

소멸자와 다른 함수 사이에서 코드를 공유하려면 별도의 함수에있는 코드 만 사용해야하며 소멸자와 다른 함수에서 코드를 호출해야합니다. 거의 모든 응용 프로그램 코드에서 명시 적으로 소멸자를 호출 할 필요는 없습니다.

std::vector

는 기본적으로 비어있는 구성과 ChildClass 생성자와 ParentClass 생성자와 소멸자가 귀하의 예제에서 모든 중복 생략 할 수 있도록 파괴에 정리되어있다.

+0

그래서 "delete Object;"라고 쓸 때 기본적으로 소멸자가 호출됩니다. –