MSVCでの配列の初期化中に、コピーまたは移動コンストラクタなしで呼び出されたデストラクタ

ウォリー

デバッグビルドとリリースビルドで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回呼び出されるのはなぜですか?

1201ProgramAlarm

VCコンパイラでこれをいじって、生成されたアセンブリコードを調べると、これはMyChar() = defaultコンストラクタに関連するコンパイラのバグのようです。に置き換えるとMyChar() { }、予期しないデストラクタ呼び出しがなくなります。

デストラクタにコードを追加すると、破棄されるオブジェクトは、デフォルトで初期化されたのメンバーになりarr1ます。への呼び出しを追加し、delete [] arr1デストラクタで破棄されるオブジェクトのアドレスを含めると、最初の要素が1回破棄され、他の6つが2回破棄されることが示されます。1回arr1は構築時、もう1回は削除呼び出しが行われるときです。 。

これはMicrosoftに報告する必要があります。VC2015とVC2017の両方で発生します。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

コピーの初期化:コピーの省略がオフになっているのに、移動またはコピーコンストラクターが呼び出されなかったのはなぜですか?

分類Dev

移動コンストラクターが呼び出されなかったのはなぜですか?

分類Dev

デストラクタ、コピー、または移動を呼び出さずに(割り当てられた)メモリを初期化する

分類Dev

コピーコンストラクタと移動コンストラクタが一緒に呼び出されるのはなぜですか?

分類Dev

C ++ 11配列の初期化はコピーコンストラクターを呼び出さない

分類Dev

移動コンストラクターではなくコピーコンストラクターが呼び出されるのはなぜですか?

分類Dev

`unique_ptr`の移動中にコピーコンストラクターがラムダで呼び出されるのはなぜですか?

分類Dev

動的に割り当てられたchar配列は、コンストラクターで初期化されていないものとして表示されます

分類Dev

ブレース付き初期化リストで初期化されたオブジェクトを返すときに、コンストラクターとデストラクタの呼び出しのペアが1つ保証されますか?

分類Dev

配列/ベクトルの挿入に対して代入演算子またはコピーコンストラクターが呼び出されますか?

分類Dev

コピーコンストラクタが呼び出されたのはなぜですか?

分類Dev

メンバーinitilizerが移動したときに追加のコンストラクター呼び出しを呼び出すのはなぜですか?

分類Dev

クラスのコピーコンストラクタが削除されたときに、クラスの配列メンバーを初期化します

分類Dev

テンプレート化されたコピーコンストラクタが呼び出されないのはなぜですか?

分類Dev

ラムダで呼び出されたコンストラクターの移動

分類Dev

コピーコンストラクターと移動コンストラクターの実行時間は同じで、移動コンストラクターは呼び出されていません

分類Dev

C ++は、初期化リストの外部で親コンストラクターを明示的に呼び出します

分類Dev

関数の戻り値でオブジェクトを初期化するときにコピーコンストラクターが呼び出されない

分類Dev

Java-インスタンスブロックがコンストラクターの後に呼び出されるのはなぜですか、またはコンストラクター内で順序的に呼び出されるのですか?

分類Dev

コンストラクターまたはinitブロックから呼び出されたオーバーライドされた抽象関数で変数を初期化するときに変数が正しく初期化されない

分類Dev

移動コンストラクターが呼び出されるのはなぜですか?

分類Dev

C ++なぜコピーコンストラクタが呼び出されたのですか?

分類Dev

パラメータをコピーすると、削除されたコンストラクタが呼び出されるべきでないときにそのコンストラクタが呼び出されます

分類Dev

コピーの省略がない場合、コピー/移動コンストラクタはデストラクタの前に呼び出されることが保証されていますか?

分類Dev

gfortranでの暗黙のdoを使用した配列コンストラクターの奇妙な初期化動作

分類Dev

コードで移動コンストラクターの代わりにコピーコンストラクターが呼び出されるのはなぜですか?

分類Dev

ASPX-パラメーター化されたコンストラクターをスキップして、パラメーターなしのコンストラクターが呼び出されるのはなぜですか?

分類Dev

MonoBehaviour以外のシリアル化されたクラスで複数のコンストラクターが呼び出されるのはなぜですか?

分類Dev

移動コンストラクターが呼び出されたときに混乱しますか?

Related 関連記事

  1. 1

    コピーの初期化:コピーの省略がオフになっているのに、移動またはコピーコンストラクターが呼び出されなかったのはなぜですか?

  2. 2

    移動コンストラクターが呼び出されなかったのはなぜですか?

  3. 3

    デストラクタ、コピー、または移動を呼び出さずに(割り当てられた)メモリを初期化する

  4. 4

    コピーコンストラクタと移動コンストラクタが一緒に呼び出されるのはなぜですか?

  5. 5

    C ++ 11配列の初期化はコピーコンストラクターを呼び出さない

  6. 6

    移動コンストラクターではなくコピーコンストラクターが呼び出されるのはなぜですか?

  7. 7

    `unique_ptr`の移動中にコピーコンストラクターがラムダで呼び出されるのはなぜですか?

  8. 8

    動的に割り当てられたchar配列は、コンストラクターで初期化されていないものとして表示されます

  9. 9

    ブレース付き初期化リストで初期化されたオブジェクトを返すときに、コンストラクターとデストラクタの呼び出しのペアが1つ保証されますか?

  10. 10

    配列/ベクトルの挿入に対して代入演算子またはコピーコンストラクターが呼び出されますか?

  11. 11

    コピーコンストラクタが呼び出されたのはなぜですか?

  12. 12

    メンバーinitilizerが移動したときに追加のコンストラクター呼び出しを呼び出すのはなぜですか?

  13. 13

    クラスのコピーコンストラクタが削除されたときに、クラスの配列メンバーを初期化します

  14. 14

    テンプレート化されたコピーコンストラクタが呼び出されないのはなぜですか?

  15. 15

    ラムダで呼び出されたコンストラクターの移動

  16. 16

    コピーコンストラクターと移動コンストラクターの実行時間は同じで、移動コンストラクターは呼び出されていません

  17. 17

    C ++は、初期化リストの外部で親コンストラクターを明示的に呼び出します

  18. 18

    関数の戻り値でオブジェクトを初期化するときにコピーコンストラクターが呼び出されない

  19. 19

    Java-インスタンスブロックがコンストラクターの後に呼び出されるのはなぜですか、またはコンストラクター内で順序的に呼び出されるのですか?

  20. 20

    コンストラクターまたはinitブロックから呼び出されたオーバーライドされた抽象関数で変数を初期化するときに変数が正しく初期化されない

  21. 21

    移動コンストラクターが呼び出されるのはなぜですか?

  22. 22

    C ++なぜコピーコンストラクタが呼び出されたのですか?

  23. 23

    パラメータをコピーすると、削除されたコンストラクタが呼び出されるべきでないときにそのコンストラクタが呼び出されます

  24. 24

    コピーの省略がない場合、コピー/移動コンストラクタはデストラクタの前に呼び出されることが保証されていますか?

  25. 25

    gfortranでの暗黙のdoを使用した配列コンストラクターの奇妙な初期化動作

  26. 26

    コードで移動コンストラクターの代わりにコピーコンストラクターが呼び出されるのはなぜですか?

  27. 27

    ASPX-パラメーター化されたコンストラクターをスキップして、パラメーターなしのコンストラクターが呼び出されるのはなぜですか?

  28. 28

    MonoBehaviour以外のシリアル化されたクラスで複数のコンストラクターが呼び出されるのはなぜですか?

  29. 29

    移動コンストラクターが呼び出されたときに混乱しますか?

ホットタグ

アーカイブ