2011-07-17 3 views
0

생성자가 new (즉, 생성자가 다른 것을 동적으로 할당해야 함)와 관련된 형식의 + 연산자를 재정 의하여하려하므로 소멸자가 delete . 어딘가에, 내가 같은 것을 사용할 수 있도록 싶습니다동적으로 할당 된 형식에 대한 C++의 오버로드 + 연산자

T c = a + b; 

내 문제 것은 내가 분명히 + 기능 내부 타입 T의 객체를 만들 필요가있다. by-copy를 반환하기 위해 + 함수 구현 내부의 스택에 T의 임시 인스턴스를 할당하면이 인스턴스의 소멸자가 + 호출 종료로 호출되어 c에 대한 할당 전에 (또는 내가 믿기 때문에) 호출됩니다. 그래서 그건 선택이 아닙니다. 내 다른 옵션은 new을 사용하고 반환 할 때 new가 반환 한 포인터를 역 참조하는 것으로 보입니다. 그러나이 방법의 문제점은 포인터에 액세스 할 수 없으므로 delete을 호출 할 수있는 방법이 없을 것입니다.

그래서 내 질문은 ... 그것은 동적 할당과 관련된 유형의 연산자를 오버로드하는 것이 드문 일은 아닐 수 있습니다. 사람들은 어떻게 그런 상황을 일반적으로 처리합니까?

+0

나는이 문제를 이해하지 못한다. 만약 당신의 타입'T'가 생성자에서'new'를 가지고 있고 소멸자에서'delete'를 가지고 있다면, 어떤 멤버는 무엇이 문제입니까? –

+0

나는 T c = a + b라고 쓰고 싶다. 문제는 + 함수가 T 유형의 객체를 반환해야한다는 것입니다.이 객체는 어디에 만들어야합니까? + 함수의 스택에서는 작동하지 않습니다. 범위를 벗어날 때 delete가 호출됩니다. 즉, + 함수에서 반환 될 때 필요한 할당 전에 나타납니다. 새 키워드를 사용하고 돌아 왔을 때 역 참조해야합니까? 그렇다면 new에 의해 반환 된 포인터를 복구 할 수는 없으며 결코 삭제할 수 없기 때문에 메모리 누수가 발생합니다. – Gravity

+0

Hmmm ... 복사 생성자가 copy로 값을 반환 할 때 자동으로 호출 되는가? 그런 일은 제가 일하려고하는 것을 만들기 위해 필요할 것입니다.이것은 C++의 설계자가 이런 종류의 문제를 해결하기 위해 구현 한 것입니까? (따라서 다른 게시물에 복사 생성자에 대한 언급이 있습니까?) – Gravity

답변

3

T가 The Rule of 3인지 확인하고 걱정할 필요가 없습니다.

+0

링크를 제공해 주셔서 감사합니다. 귀하의 링크 때문에 필자는 복사 생성자를 만들지 않았기 때문에 내 코드가 이상한 메모리 오류가 발생하기 쉽다는 것을 알게되었습니다. 그래도 내가 직접 말한 걱정은 어떨까? 왜 3의 규칙에 따라 위에서 설명한 상황에서 나를 구할 수 있습니까? – Gravity

+0

@Gravity :'return'은 반환 값의 복사본을 만들기 때문에 (NRVO가 발생하지 않는 한 @ tg의 대답을 참조하십시오. 그러나 파괴는 지연됩니다). –

+0

맞아, 이제 알 겠어. bitwise (C 스타일) 복사를 수행하는 대신 복사 생성자를 반환하는 것을 알지 못했습니다. – Gravity

0

std::stringstd::vector 어떻게 든 할 수 있고 수업도 있습니다. 나는 당신이 소스 코드를 배울 것을 제안하지 않는다. 그것은 매우 협박적이다. 다른 포스터가 말했듯이, 3의 규칙은 당신의 친구입니다. 나는 당신이해야한다고 덧붙일 수있다. new이다. 스택에 할당하고 값으로 반환하십시오. C++은 필요한 마술을 할 것입니다.

3

당신은 컴파일러에 따라 당신의 연산자 구현, 종료시 다음 operator+ 내에서 스택의 임시 객체를 생성하는 경우 :

전달됩니다 개체가 다른 임시 객체에 복사 생성자를 통해 전달됩니다
  1. , 복사 생성자를 통해 c으로 다시 전송하십시오. 또는
  2. 개체가 복사 생성자를 통해 c에게 전달됩니다. 또는
  3. 임시 개체는 실제로는 c이고 복사 생성자 호출은 없습니다. 앞서 언급 한 바와 같이 당신이 3의 규칙을 따라 복사 생성자와 대입 연산자의 올바른 구현을 제공하는 경우 어떤 상황에서 어떤 문제가되지 않습니다,

(http://en.wikipedia.org/wiki/Return_value_optimization 참조), 그래서 당신은 걱정할 필요가 없습니다 실제 구현에 대해 (당신이 성능에 열중하지 않는다면). OOP에 관한 모든 것입니다.

+0

+1. 내 문제는 지나가는 by-copy가 어떻게 작동 하는지를 이해하지 못했다는 것이 었습니다. – Gravity

관련 문제