2010-12-17 7 views
1

私は(私のコンパイラがそう言う!)、これは間違っている実現:メモリリークを起こさずにローカル/一時オブジェクトへの参照を返すか?

Rectangle& Rectangle::Overlap(const Rectangle& rectangle) { 

    Point topLeft(__max(this->GetVerticies()[0]->GetX(), rectangle.GetVerticies()[0]->GetX()) - __min(this->GetVerticies()[0]->GetX() + this->GetWidth(), rectangle.GetVerticies()[0]->GetX() + rectangle.GetWidth()), 
       (__max(this->GetVerticies()[0]->GetY(), rectangle.GetVerticies()[0]->GetY()) - __min(this->GetVerticies()[0]->GetY() + this->GetHeight(), rectangle.GetVerticies()[0]->GetY() + rectangle.GetHeight()))); 

    Point bottomRight(__min(this->GetVerticies()[0]->GetX() + this->GetWidth(), rectangle.GetVerticies()[0]->GetX() + rectangle.GetWidth()), topLeft.GetY() + __max(this->GetVerticies()[0]->GetY() + this->GetHeight(), rectangle.GetVerticies()[0]->GetY() + rectangle.GetHeight())); 

    return Rectangle(topLeft, bottomRight); 
} 

メモリリークを発生させずに計算された矩形を返すための正しい方法でしょうか? Rectangle * result = new Rectangle(topLeft、bottomRight)として矩形を定義すると、逆参照されたポインタが返されますが、間違っているようです。助言がありますか?

+0

これはメモリリークではありません。逆に、実際にアクセスする前にメモリ(Rectangle()コンストラクタを呼び出すと作成される一時変数)を解放しています。回避策については、hkasierの答えを参照してください。 –

答えて

4

いずれかの値でリターン:

あなたの関数本体を変更する必要、または結果を返すために追加のパラメータを追加しません
Rectangle Rectangle::Overlap(const Rectangle& rectangle); 

void Rectangle::Overlap(const Rectangle& rectangle, Rectangle& out); 

とアウトに結果を代入パラメータ。

+0

または、2番目の例でポインタを使用してCの方法を実行します。場合によっては読みやすさが向上します。 –

3

戻り値の型を非参照(値)にします。次に、暗黙のコピーコンストラクタを使用して、返された値が正常になります。

3

戻り値の型をRectangleに変更してください。

3

ちょうど1つの参照ではなく、矩形を返します。

関連する問題