2017-04-21 7 views
0

私はオーバーロードされた=可変演算子を持っています。 この変数はラムダで使用され、ポインタによって渡されます。 私は、この演算子を使用する場合、私はどうなる:逆参照せずにポインタ上の演算子を実行

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

を、それはポインタを逆参照し、デストラクタは起こるべきではありません範囲の最後に呼び出されますが。

だからデストラクタの呼び出しを防ぐために、私が行います

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

は、この長いバージョンなし=演算子を達成するために、他の正常な規則はありますか?

+1

'CreateBuffer'は' * buf'型の値を返しますか? 'CreateBuffer'の戻り値は、どちらの場合でも破棄する必要のある一時的なオブジェクトを作成するので、デストラクタが呼び出されるのを防ぐことはできません。私はあなたが持っている* root *の問題だと本当に疑っています。もしあなたがデストラクタを呼び出されたくない理由をもっと詳しく説明したら、私たちはあなたを助けることができますか?あなたが持っている*実際の問題は何ですか? [3,5、または0のルール](http://en.cppreference.com/w/cpp/language/rule_of_three)に従わないため、問題がありますか? –

+0

'buf'が通常のポインタの場合、それらは全く同じです。 (どちらも '(* buf).operator =(CreateBuffer(w、h、type、c));')です。 – molbdnilo

答えて

1

あなたのオペレータは、ポインタのための、しかし、尖ったタイプのため、オーバーロードされていないポインタ

にオペレータを実行します。したがって、 "演算子をポインタで実行"することはできません。指示されたオブジェクトで演算子を実行するには、*または->を使用してポインタを逆参照する必要があります。

しかし、それはポインタをデリファレンスし、デストラクターはスコープの最後に呼び出されますが、これは発生しません。

あなたは(bufプリミティブポインタではなく、ラッパークラスであれば、あなたがすることはできません)operator*ための奇妙な過負荷を持っていない限り、ポインタを間接参照すると、デストラクタが呼び出されることはありません。 mcveのないことを確認することは不可能であるが、

私は、あなたがdecltype(*buf)CreateBufferからの変換に起因して作成される一時のデストラクタを、観察していることを、疑いがあります。

関連する問題