2014-07-10 49 views
-1

(通過指針傳遞)使用堆棧超載,按值傳遞:除了分配超載基於此鏈接增加分配

http://www-01.ibm.com/support/knowledgecenter/SSGH3R_8.0.0/com.ibm.xlcpp8a.doc/language/ref/cplr318.htm%23cplr318?lang=en

complx complx::operator+ (const complx& c) const 
{ 
     complx result; 
     result.real = (this->real + c.real); 
     result.imag = (this->imag + c.imag); 
     return result; 
} 

BU我想用這樣的:

complx& complx::operator+ (const complx& c) const 
    { 
      complx result = new complx; 
      result->real = (this->real + c.real); 
      result->imag = (this->imag + c.imag); 
      return *result; 
    } 

這是正確的嗎?我應該在哪裏釋放堆?有沒有更好的方法?

+0

爲什麼你想返回一個你剛剛在堆上創建的東西的引用?第一個簽名怎麼樣擔心你? – Pradhan

+2

第一個例子*是「更好的方式」。你能用第一種方式解釋你有什麼問題嗎? –

+0

我是我錯了,但我總是嘗試避免按值傳遞(不必要地複製值並且堆棧的大小有限)。 – user1436187

回答

0

除非您自己手動重新分配,否則沒有正確的方法可以釋放您分配的內存。您可以使用SmartPointers進行分配。當你完成它時它會釋放內存。另一種釋放它的方式是垃圾收集,它不存在於C++中。

3

自從C++ 11以來,按值複製並沒有與之相關的舊烙印。編譯器可以刪除副本。否則,他們被要求在可複製的情況下移動變量。一種很常見的情況是當你返回一個自動函數變量時。在你的第一個例子中,result至少被移動。它很可能會被NRVOed。所以,如果需要的話,實現complx的移動構造函數並使用第一個簽名。

+0

一般的好建議,但在這種情況下'complx'包含2個'double's,所以移動構造函數不會有任何好處。 – Praetorian

+0

@Praetorian 。你是對的,當然:) – Pradhan

+0

C++ 98也有複製elision和NRVO,所以傳遞值也是可取的那裏 –