class someClass
{
public:
int* ptr2Int;
};
これは有効なクラスですか (はい、コンパイルされます)? 逆参照する前に ptr2Int に値を割り当てた場合、クラスは期待どおりに動作することが保証されていますか?
class someClass
{
public:
int* ptr2Int;
};
これは有効なクラスですか (はい、コンパイルされます)? 逆参照する前に ptr2Int に値を割り当てた場合、クラスは期待どおりに動作することが保証されていますか?
クラス内の初期化されていないポインターは、スタンドアロンの初期化されていないポインターとまったく違いはありません。ポインターを危険な方法で使用しない限り、問題はありません。
ただし、初期化されていないポインターを使用する「危険な方法」には、その値を読み取ろうとする試みが含まれることに注意してください (逆参照は必要ありません)。ポインターに有効な値が割り当てられる前にこれらの暗黙的なメンバー関数を使用すると、クラスに存在する暗黙的なコンパイラー提供のコピー コンストラクターおよびコピー代入演算子がこのような試行を実行する可能性があります。
実際、私が間違っていなければ、この問題は標準化委員会レベルで議論された問題でした。暗黙的に生成されたメンバー関数は、クラスの初期化されていないメンバーに存在する可能性のあるトラップ表現をトリップすることが許可されていますか? 判決がどうだったかは覚えていません。(あるいは、C99 のコンテキストでその議論を見たのでしょうか?)
はい、大丈夫です。ポインター自体は存在しますが、その値は不明であるため、逆参照は安全ではありません。初期化されていない変数を持つことはまったく問題なく、ポインターも同じです
はい、これは単一の初期化されていないポインターを持つ とまったく同じstruct
であり、どちらも問題なく動作することが保証されています (もちろん、ポインターを使用する前にポインターを設定している限り)。
ポインターを逆参照するまでは問題ありませんが、それは未定義の領域です。
一部のコンパイラは、デバッグ モードでコンパイルするかリリース モードでコンパイルするかに応じて、ポインターをデフォルト値 (null など) に設定します。そのため、物事はあるモードで機能し、突然すべてが別のモードで崩壊する可能性があります.