デバッグビルドとリリースビルドでMSVCバージョン19.10.25019.0と19.11.25547.0でこれを試しましたが、同じ結果が得られました。
次のプログラムはを出力し0 1 2 3 4 5
ます。私はどちらかを期待しました
代わりに、7つの要素のうち6つに対してデストラクタが呼び出され、コピーまたは移動コンストラクタの呼び出しは行われなかったようです。
#include <iostream>
struct MyChar {
MyChar(char c) : c{c}{}
MyChar() = default;
MyChar(const MyChar&) { std::cout << "copy"; };
MyChar& operator=(const MyChar&) { std::cout << "assign"; return *this; };
MyChar(MyChar&&) { std::cout << "move"; };
MyChar& operator=(const MyChar&&) { std::cout << "move assign"; return *this; };
~MyChar() { std::cout << cnt++ << '\t'; }
char c{'H'};
static int cnt;
};
int MyChar::cnt{};
int main()
{
auto arr1 = new MyChar[7]{'D'};
}
デストラクタが削除せずに(またはコンパイラがコピーまたは移動によって初期化せずに)6回呼び出されるのはなぜですか?
VCコンパイラでこれをいじって、生成されたアセンブリコードを調べると、これはMyChar() = default
コンストラクタに関連するコンパイラのバグのようです。に置き換えるとMyChar() { }
、予期しないデストラクタ呼び出しがなくなります。
デストラクタにコードを追加すると、破棄されるオブジェクトは、デフォルトで初期化されたのメンバーになりarr1
ます。への呼び出しを追加し、delete [] arr1
デストラクタで破棄されるオブジェクトのアドレスを含めると、最初の要素が1回破棄され、他の6つが2回破棄されることが示されます。1回arr1
は構築時、もう1回は削除呼び出しが行われるときです。 。
これはMicrosoftに報告する必要があります。VC2015とVC2017の両方で発生します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加