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