2013-11-04 2 views
1

동적 메모리가 연결된 객체 (함수 내에서 로컬로 선언 된 객체)를 반환하는 방법을 찾지 못했습니다. 문제는 객체가 범위를 벗어날 때 동적 인 메모리를 실행하고 삭제하는 소멸자입니다. 즉, 객체를 반환하고 삭제 된 메모리의 데이터를 사용하려고 할 때입니다. 오버로드 된 연산자에 대해이 작업을 수행합니다.동적 메모리가있는 객체 반환

내가 좋아하는 뭔가를 할 노력하고있어 :

MyObj operator+(const MyObj& x, const MyObj& y) 
{ 
    MyObj z; 

    // code to add x and y and store in dynamic memory of z 

    return z; 
} 

내 소멸자 단순히 :

MyObj::~MyObj() 
{ delete [] ptr; } 

어떤 제안이 많이 주시면 감사하겠습니다!

+3

에 읽을 할 수 있습니다 : ['C++ : Three'의 규칙 (HTTP : // EN .wikipedia.org/wiki/Rule_of_three_ (C++ _ 프로그래밍)), [이 질문과 답변] (http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three)을 참조하십시오. – WhozCraig

답변

2

ptr의 내용을 새 개체에 복사하는 복사 생성자를 제공해야합니다.

MyObjptr의 내용을 복사 한 다음 삭제 한 메모리의 ptr 지점이됩니다 개체를 반환 복사 생성자가없는 경우. 말할 필요도없이이 상황에서 ptr에 액세스하려고하면 나쁜 일이 일어납니다.

일반적으로 클래스의 소멸자를 작성해야한다면 동적 생성자 또는 다른 리소스의 복사를 처리하기 위해 복사 생성자와 할당 연산자를 작성해야합니다. 이것은 WhosCraig가 언급 한 3 가지 규칙입니다.

당신이 C++ 11을 지원하는 현대 컴파일러를 사용하는 경우, 당신은 또한이를 읽고 move semantics

3

괜찮습니다.

삭제하기 전에 개체가 다른 개체로 복사되거나 임시로 사용되므로 걱정하지 마십시오.

하지만 ...

시도는 잘 정의 된 복사 생성자을 (당신이 그것을이없는 경우) 작성합니다. rule of five을 준수해야합니다.

반면에 코드에는 RVO 최적화가 불필요한 복사본과 추가 파괴를 피할 수있는 좋은 기회가 있습니다.

또한 C++ 11은 불필요한 복사본을 피하기 위해 move semantics을 제공합니다. 이를 위해서는 이동 생성자무브먼트 지정을 작성해야합니다.

+0

RVO에 대해 옳은지도 모르지만 위험에 의거합니다. – Dima

+0

사실, 내가 작성한 진술은 규칙을 어기는 것이 아니라 최적화를 목표로하는 것입니다. – deepmax

+0

'MyObj'가'ptr'의 내용을 복사하는 복사 생성자를 가지고 있지 않다면 기다려주세요. – Dima