私は現在、ファクトリ関数のパターンを実装できるようにするために、C++とcopy elision、特に「名前付き戻り値最適化」(NRVO)と苦労しています。異なるコンパイラ間で一貫した動作を得ることができません。注:virtual base-dtorを削除すると問題は解決しますが、実際の実装には必要です。強制的にコピーを削除しますか? gcc 5.4.1
デストラクタが呼び出されたGCC 5.4.0の場合は、何のコピーの省略が行われていない:
$ g++ test2.cpp && ./a.out
start
dtor derived
dtor base
done. should have leaked!
のgcc 5.4.1を使用している場合(Ubuntuは5.4.1、それを呼び出し、私は、これはSVN-頭であると仮定)、私は様々な他のGCCの上だけでなく、私の手を得ることができ、すべてのclangsがエリジオンを実行し、正常にメモリリーク:私はinternetz間で異なる場所を読んで
$ g++ test2.cpp && ./a.out
start
done. should have leaked!
、コンパイラはは、コピーを行うこと許可されていますelision(必須ではありません)。 C++ 17のみ保証付きコピーelisionを導入しています。これはgcc 5.4.0のバグですか、それとも単に標準を違う方法で実装しているのですか?
コンパイラが最適化を許可されていても、それをする必要はありません。 – NathanOliver
私は質問を編集し、gccの健全なコードについての部分を削除します - この部分は、とにかくofftopicになります。 – SergeyA
「正常にリークしました」と言えば、GCCにもメモリが漏れていることに気付いていますか? 'f()'によって返された一時的なものは、新しい(コピーコンストラクタで)割り当てられたメモリにコピーされ、次に破棄されます。そして、それはあなたが見ているデストラクタです。 –