2012-05-02 4 views
3

의 결과를 삽입 한 후 벡터에 나타납니다.쓰레기 I는 다음과 같이 정의 된 연산자를 사용하여 객체를 작업자

벡터 내부에 추가 결과를 직접 지정하면 내부에 가비지가 나타납니다.

P p1(1.0, 0.0, 0.0); 
P p2(0.0, 0.0, 0.0); 

vector<P> v(1); 
v[0] = p1 + p2; // v[0] now contains garbage. 

변수를 통해 수행하는 경우 모든 것이 예상대로입니다.

vector<P> u(1); 
P q = p1 + p2; 
u[0] = q; // u[0] contains correct value. 

이러한 동작의 원인은 무엇입니까? 두 경우의 차이점은 무엇입니까?

+0

"복사 또는 할당 연산자가 없습니다. *"특별히 정의하지 않았습니까? (이 경우 컴파일러에서 암시 적으로 정의 할 가능성이 높습니다)? 또는 당신이 그들을 무력화 시키려고 나갔다는 것입니까? – ildjarn

+0

@ildjarn 나는 그것들을 특별히 정의하지 않았다고 말하고자했다. 더 명확하게하기 위해 내 질문을 수정했습니다. – Artium

+0

차이점은 겹쳐 쓰여지기 전에 유효하지 않은/삭제 된 임시 읽기에서 읽은 두 번째 예제입니다. (둘 다 규칙에 어긋나고 임시는 죽었습니다.) –

답변

10

임시 참조를 반환합니다. 이것은 일시적인 것이 함수의 끝에서 범위를 벗어나기 때문에 (이 경우, operator+ 함수) 나쁜 생각입니다. 연산자를 다음과 같이 선언하십시오 :

P operator +(const P &rhs) const 

대신에 연산자를 선언하십시오.

+0

'P 연산자 + (const P & rhs) const' 여야합니다 - 당신이 가지고있는 것처럼, 이동 의미는 금지되어 있습니다. – ildjarn

+0

@ildjarn : 감사합니다. – thiton

+0

이것이 문제라고 생각했는데 결과를 벡터에 할당 할 때만 문제가 발생하는 이유는 무엇입니까? – Artium

3

당신이

P& operator +(const P &rhs) 
{ 
    return P(x + rhs.x, y + rhs.y, z + rhs.z); 
} 

함수 operator +의 범위에서 한 번 파괴 된 지역 변수에 대한 참조를 반환 볼 것이다 것처럼.

포인터를 힙에 생성 된 데이터로 되돌릴 수는 있지만 호출자가 개체를 삭제하지 못하면 메모리 누수 범위가 충분하지 않습니다.

당신은 또한 사본으로 객체를 반환 할 수 있지만, 시간에 그 최근의 C++ 11에서 진정한 오버 헤드

될 향후 이상적인 선호 접근해야 소유권을 전송하는 이동 구문을 사용할 수 있습니다 .

+4

"* 또한 객체를 복사본으로 반환 할 수 있지만 때때로 실제 오버 헤드가 될 수 있습니다 *"모든 최신 컴파일러는 [RVO] (http://en.wikipedia.org/wiki/Return_value_optimization)를 구현합니다. – ildjarn

+0

@ildjarn : 나는 약간 구식 인 것 같습니다. :-) – Abhijit

관련 문제