我正在創建一個自定義對象並覆蓋+運算符。我返回一個相同類型的新對象。在這種方法中分配內存是不好的做法嗎?因爲我然後需要刪除超出範圍的內存。在C++中重寫+運算符時分配內存
0
A
回答
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'是微不足道的複製,那麼它沒有任何區別。 –
相關問題
- 1. c + +重載運算符+和動態內存分配
- 2. 用'new []'運算符分配內存
- 3. C++重載運算符()用於分配
- 4. C/C++:動態分配內存上的按位運算符
- 5. 動態內存分配和輸入(流)運算符C++
- 6. 釋放由賦值運算符分配的內存C++
- 7. 內存分配運行時錯誤C
- 8. 在C中重新分配內存
- 9. 在C++中爲動態分配類型重載+運算符
- 10. c#中的聲明是分配內存還是分配內存的新運算符?
- 11. 在C++中分配內存時出錯
- 12. SIGKILL同時在C++中分配內存
- 13. C++運算符在已重載的運算符中重載
- 14. 運算符重載C++:只寫版本
- 15. 什麼是重寫的C運算符++
- 16. C#如何管理循環內由新運算符分配的內存?
- 17. 問題與重載分配運算符
- 18. C++內存分配在C
- 19. 動態分配和重新分配樹中的內存算法
- 20. C++:運算符重載,運算符+
- 21. +運算符重載在C++
- 22. 重載[] []在C++運算符
- 23. 重寫通過cudaHostAlloc()分配的內存
- 24. 在C++中用void *分配內存結構內存分配
- 25. 內聯重載運算符C++
- 26. 在編譯時分配的C++內存
- 27. 運算符在C++幫助中重載流提取運算符
- 28. C++中的運行時內存分析
- 29. 在C/C++中分配內存失敗
- 30. 在C/C++中的內存分配
爲什麼你需要首先分配任何東西?運算符+表示您的對象具有值語義,所以不應該有任何類型的動態分配。如果存在,最好選擇一個不同的函數名稱。 –
@KerrekSB - 'string :: operator +'分配內存。 –
@Rob:好點 - 證明規則的例外? String也知道如何自行清理。 :-) [其實,你確定加運算符分配嗎?我想可能會有一些構造函數和append()或insert()處理實際分配的組合。] –