1. ホーム
  2. c++

[解決済み] C++構造体の正しい初期化方法

2022-03-09 19:33:26

質問

コードにPOD(Plain Old Datastructure)構造体が含まれています(基本的なc++構造体で、他の構造体やPOD変数が含まれており、最初に初期化する必要があります)。

私が調べたところでは 読む と思われます。

myStruct = (MyStruct*)calloc(1, sizeof(MyStruct));

がそうであるように、すべての値をゼロに初期化する必要があります。

myStruct = new MyStruct();

しかし、構造体を2番目の方法で初期化した場合、それらの変数を使用すると、Valgrindは後で "条件付きジャンプまたは移動が初期化されていない値に依存する "と訴えます。私の理解に誤りがあるのでしょうか、それともValgrindが誤検出を投げているのでしょうか?

解決方法は?

C++では、クラスと構造体は(初期化という点では)同一です。

非 POD 構造体は、メンバを初期化できるようにコンストラクタを持つ方がよいでしょう。
構造体が POD の場合は、イニシャライザを使用できます。

struct C
{
    int x; 
    int y;
};

C  c = {0}; // Zero initialize POD

また、デフォルトのコンストラクタを使用することもできます。

C  c = C();      // Zero initialize using default constructor
C  c{};          // Latest versions accept this syntax.
C* c = new C();  // Zero initialize a dynamically allocated object.

// Note the difference between the above and the initialize version of the constructor.
// Note: All above comments apply to POD structures.
C  c;            // members are random
C* c = new C;    // members are random (more officially undefined).

valgrindが文句を言っているのは、C++が以前はそうだったからだと思います。(C++がいつゼロ初期化デフォルト構築でアップグレードされたかは、正確にはわかりません)。あなたの最善の策は、オブジェクトを初期化するコンストラクタを追加することです(構造体はコンストラクタを許可されています)。

余談ですが
多くの初心者がinitを大切にしようとする。

C c(); // Unfortunately this is not a variable declaration.
C c{}; // This syntax was added to overcome this confusion.

// The correct way to do this is:
C c = C();

私よりも、「"Most Vexing Parse"」で検索した方が、より良い説明が得られると思います。