2012-02-28 2 views
0
class B 
{ 

private: 
int _x; 
public: 
int get(){return _x;}; 
B(int x=10):_x(x){cout<<"Default constructor "<<endl;} 
~B(){cout<<"destructor "<<endl;} 
B(const B &rhs){cout<<"copy constructor"<<endl;} 
B& operator =(const B &rhs){cout<<"copy assignment operator"<<endl;} 
int operator *(){cout<<"operator *"<<endl;return _x;} 
}; 

int main() 
{ 
vector<B> v; 
int i; 
vector<B>::iterator ii=v.begin(); 

for(i=0;i<1;i++) 
{ 
v.push_back(*(new B(i*100))); 
} 
ii = v.begin(); 
cout<<"#####################"<<endl; 
ii = v.insert(ii+1,*(new B())); 
cout<<"#####################"<<endl; 

return 0; 
} 

출력 왜 v.insert에서 (II * (새 B())); 두 복사본 생성자가STL 벡터 인서트 - 복사 생성자

Default constructor 
    copy constructor 
    ##################### 
    Default constructor 
    1. copy constructor 
    2. copy constructor 
    destructor 
    ##################### 
    destructor 
    destructor 

라고되어 ??

+3

C++은 ** 자바가 아닙니다 **. ** push_back (* (new B (i * 100)))'와 같은 것을 작성해서는 안됩니다. 힙에 B *의 인스턴스를 만든 다음 잊어 버립니다. 당신이 기본적으로 기억을 새고있다. 'B' 클래스가 암시 적으로 생성 될 수 있기 때문에'push_back (B (i * 100))'또는'push_back (i * 100)'을 사용할 수 있습니다. – ereOn

답변

5

우선, new에서 할당 된 메모리를 삭제하지 않으므로 메모리 누수가 있습니다. 올바른 작업 방법은 v.push_back(B(100));입니다.

copy ctor가 두 번 호출되는 이유에 대해서는 두 번째 삽입시 벡터가 용량에 도달하여 재 할당하는 것처럼 보입니다. 이 재 할당 도중 이전에 삽입 된 요소를 새로 할당 된 메모리에 복사합니다. 따라서 복사본 ctor가 두 번 호출되는 것을 볼 수 있습니다.

1

더 심각한 문제는 *(new B())이 메모리 누수라는 것입니다. 동적으로 할당 된 개체를 복사 한 다음 포인터 만 버리십시오. 대신 임시 객체를 생성해야합니다

v.insert(ii+1, B()); 

는 질문에 대답하기 : 벡터 메모리의 연속 블록으로 저장되기 때문에, 그들이 성장에 따라 용량을 증가시키기 위해 때때로 필요가있다. 이 경우 배열의 모든 객체를 새 위치로 복사 (또는 이동)해야합니다. 여기서 기존 요소를 이동하는 사본 하나와 새로운 요소를 삽입하는 사본을 볼 수 있습니다.