2014-11-11 3 views
2

다음은 나를 혼란하게하는 코드가있다 :벡터에서 지우기 중에 클래스의 멤버는 어떻게됩니까?

class Simple{ 

    private: 
    int m_nID; 

    public: 
    Simple(int nID) { 
    m_nID = nID; 
    } 

    ~Simple() { 
    std::cout << "Destructing Simple " << m_nID << std::endl; 
    } 

    Simple(const Simple& other) { 
    m_nID = other.m_nID; 
    }; 
}; 

int main(){ 
    Simple Simple1(1); // allocating on stack 
    Simple Simple2(2); // 
    Simple Simple3(3); // 
    std::vector<Simple> m; 

    m.push_back(Simple1); // 
    m.push_back(Simple2); // copy constructor called 
    m.push_back(Simple3); // 
    std::cout << "\n------ ERASING ELEMENTs FROM VECTOR-------" << std::endl; 
    m.erase(m.begin()); // 
    m.erase(m.begin()); // destructor called 
    m.erase(m.begin()); // 
    std::cout << "\n------ After ERASING ELEMENT FROM VECTOR-------" << std::endl; 
    return 0; 
} 

왜이 세 가지 라인 :

m.erase(m.begin()); 
    m.erase(m.begin()); 
    m.erase(m.begin()); 

원인이 출력 :

Destructing Simple 3 
    Destructing Simple 3 
    Destructing Simple 3 

m_nID 항상 3 왜? 각 push_back 복사 생성자에 대해 1,2,3을 m_nID에 복사하므로 다음과 같아야합니다.

Destructing Simple 1 // or 3 
    Destructing Simple 2 // or 2 
    Destructing Simple 3 // or 1 

? 내가 그것을 실행하면

+4

'm.mVector' :

마찬가지로, 또한 assignemnt 연산자를 정의? –

+0

생성자를 장황하게 만들 수도 있습니다. 벡터로 푸시 할 때 재사용 (복사 및 삭제)이 발생할 수 있지만 여기에는 삭제 만 표시됩니다. –

+0

@JosephMansfield, 내 게시물을 수정했습니다. – maciekm

답변

7

std::vector은 첫 번째 요소를 어떻게 제거합니까? 요소의 을 하나씩 (할당을 사용하여) 복사 한 다음 마지막으로 을 소멸시킵니다. 복사 생성자를 할당하고 할당을 시도하면 어떤 일이 일어나는지보실 수 있습니다. 합니다 (push_back을 할 때 벡터 는 용량을 증가하는 경우도, 예기치 않은 사본을 볼 수 있습니다.)

0

내가 얻을

Destructing Simple 1 
Destructing Simple 1 
Destructing Simple 2 
Destructing Simple 3 
Destructing Simple 3 
Destructing Simple 3 
Destructing Simple 3 
Destructing Simple 2 
Destructing Simple 1 

이 벡터에 밀어 것은

주위에 물건을 많이 션트 것을 입증 할 날 것으로 보인다 (단순히 m 존재하지 않는 m.mVector에 대한 참조를 수정 후)

편집 - 그들이 균형을하지 않는 것이 너무

Constructing Simple 1 
Constructing Simple 2 
Constructing Simple 1 
Destructing Simple 1 
Constructing Simple 3 
Constructing Simple 1 
Constructing Simple 2 
Destructing Simple 1 
Destructing Simple 2 
Destructing Simple 3 
Destructing Simple 3 
Destructing Simple 3 
Destructing Simple 3 
Destructing Simple 2 
Destructing Simple 1 

흥미로운 복사 생성자에 추가 추적. 나는 지금 이것에 대해서도 놀랐다. 특히 Mike Seymour가 마지막 세 줄은 원래 스택 버전이 파괴되었다고 지적했다.

+0

thx,하지만 내 게시물을 편집하고 내 혼란은 여전히 ​​존재합니다. – maciekm

+2

마지막 세 줄은 벡터 요소가 아닌 로컬 변수를 파괴합니다. –

4

첫 번째 요소를 삭제하는 경우, 하나 개의 요소 (마지막)이 파괴된다. 다른 요소는 뒤에서 앞쪽으로 할당됩니다.

Initial state:  1, 2, 3 
State after copy: 2, 3, 3 
State after erase: 2, 3 
State after copy: 3, 3 
State after erase: 3 
Final state:  [empty] 

3은 항상 마지막에 지정됩니다.

1

Simple(const Simple& other) { 
    std::cout << "Copy from "<< other.m_nID << std::endl; 
    m_nID = other.m_nID; 
    }; 

로 복사 생성자를 확인하고 복사 및 파괴의 결과로 발생하는 벡터 해제 및 reallcoation에 물건을 밀어 때 당신은 어떻게 볼 수 있습니다. `mVector` 여기에 무슨 -

Simple& operator=(const Simple& other) 
{ 
    std::cout << "assign from " << other.m_nID << " to " << m_nID << std::endl; 
    m_nID = other.m_nID; 
    return *this; 
} 
+0

복사 생성자는 다음을 제공합니다 :'Copy from 1,2,3' – maciekm

+0

thx, http://ideone.com/oqwGbV에서 몇 가지 테스트를 한 후 도움이되었습니다. 어떻게 작동하는지 이해했습니다. – maciekm

관련 문제