[解決済み] 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"」で検索した方が、より良い説明が得られると思います。
関連
-
[解決済み】C++ 式はポインタからオブジェクトへの型を持っている必要があります。
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み】'std::cout'への未定義の参照
-
[解決済み] C++でintをstringに変換する最も簡単な方法
-
[解決済み] HashMapを直接(リテラルに)初期化する方法は?
-
[解決済み] 配列のすべてのメンバーを同じ値で初期化するには?
-
[解決済み] HashSetの値を構造的に初期化する方法は?
-
[解決済み] std::vectorをハードコードされた要素で初期化する最も簡単な方法は何ですか?
-
[解決済み] C++で静的プライベートメンバを初期化する方法は?
-
[解決済み] C言語標準に準拠した構造体の初期化方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++でユーザー入力を待つ【重複あり
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み】'cout'は型名ではない
-
[解決済み】エラー:free(): 次のサイズが無効です(fast)。
-
[解決済み] [Solved] インクルードファイルが開けません。'stdio.h' - Visual Studio Community 2017 - C++ Error
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。
-
[解決済み] to_string は std のメンバーではない、と g++ が言っている (mingw)
-
[解決済み] 警告:暗黙の定数変換でのオーバーフロー
-
[解決済み] 型名の後の括弧は、newで違いがあるのでしょうか?