2017-04-21 54 views
0

我有變量buff,它有overloaded = operator。 這個變量在lambda中被使用並且被指針傳遞。 當我想用這個操作符,我會做:在指針上執行運算符而不會解除引用

*buf=CreateBuffer(w, h, type, c); 

然而,它取消引用指針和析構函數被調用時的範圍不應該發生的結束。

所以要防止析構函數的調用我做的:

buf->operator=(CreateBuffer(w, h, type, c)); 

有沒有其他的通常慣例,實現=運算符沒有這個長的版本?

+1

'CreateBuffer'是否按照值返回任何類型的'* buf'?然後,你不能真正阻止析構函數被調用,因爲'CreateBuffer'的返回創建了一個需要在兩種情況下都被破壞的臨時對象。我真的懷疑這是你的*根*問題,也許如果你給出更多的細節*爲什麼*你不希望析構函數被調用我們可以幫助你更好?你有什麼*實際*問題?你有沒有遇到問題,因爲你沒有遵循[三,五或零的規則](http://en.cppreference.com/w/cpp/language/rule_of_three)? –

+0

如果'buf'是一個常規指針,那麼這些指針完全相同。 (都是'(* buf).operator =(CreateBuffer(w,h,type,c));'。)請發佈相關代碼而不是描述它。 – molbdnilo

回答

1

上指針執行操作

您的運營商不超載的指針,但對於尖頭型。因此你不能「在指針上執行操作符」。要在指出的對象上執行操作符,您必須使用*->對指針取消引用。

但是它的引用指針和析構函數在範圍的末尾被調用,不應該發生。

解引用指針不會導致析構函數被調用,除非你有operator*一個奇怪的過載(你不能有,如果buf是一種原始的指針,而不是包裝類)。

我懷疑,你正在觀察一個臨時的析構函數,即由於從CreateBuffer創建轉化成decltype(*buf),雖然這是不可能的,以確保沒有mcve