2011-09-28 56 views
0

我正在創建一個自定義對象並覆蓋+運算符。我返回一個相同類型的新對象。在這種方法中分配內存是不好的做法嗎?因爲我然後需要刪除超出範圍的內存。在C++中重寫+運算符時分配內存

+2

爲什麼你需要首先分配任何東西?運算符+表示您的對象具有值語義,所以不應該有任何類型的動態分配。如果存在,最好選擇一個不同的函數名稱。 –

+1

@KerrekSB - 'string :: operator +'分配內存。 –

+0

@Rob:好點 - 證明規則的例外? String也知道如何自行清理。 :-) [其實,你確定加運算符分配嗎?我想可能會有一些構造函數和append()或insert()處理實際分配的組合。] –

回答

4

是的,沒有進一步的信息,這是不好的。

通常你:

struct X 
{ 
    int m_i; 
    X(int i) : m_i(i) { } 

    X operator+(const X& another) const 
    { 
     return X(m_i + another.m_i); // note, not new X(...) 
    } 
} 

這就是說,你可以返回的unique_ptr如果你真的有動態分配。

2

有超載operator+返回對象的實例作爲結果,沒有動態分配的一個很好的例子。

來源是here,有很多關於如何重載操作符的解釋。

的例子是這樣的:

// Add this instance's value to other, and return a new instance 
    // with the result. 
    const MyClass MyClass::operator+(const MyClass &other) const { 
    return MyClass(*this) += other; 
    } 

它假定你實現operator+=和拷貝構造函數,如果你沒有做+= - 只是把賦值操作有直接。閱讀鏈接瞭解更多詳情。

+2

請注意,返回'const MyClass'有阻止某人編寫'(a + b)= c'的好處,但缺點是阻止C++ 11移動語義,並且在C++ 03中阻止了等價的「互換優化「,」(b + c).swap(a)'。基本上,如果我想寫'a = b + c'(作爲一個賦值,而不是初始化),那麼爲了提高效率,我需要'b + c'來返回可變的內容。當然,如果'MyClass'是微不足道的複製,那麼它沒有任何區別。 –