私は自分のコードでこの奇妙なポインターのない状況に遭遇し、それを検出する方法(クラッシュ以外)があるかどうか疑問に思っています。コードは、なんとか未構築のオブジェクトのメソッドに入ることができます。b1が作成されたとき、aは作成されておらず、bはそれを使用しようとします。b2が構築されるまでに、aは適切に構築され、コードは期待どおりに機能します。
「コードでこれを行わないでください」という明白なことを超えて、コンパイル時または実行時にこれを検出する方法があるかどうか疑問に思っています。コンパイラはそれをまったく検出しませんでした。プログラムがクラッシュしたときにDLLを初期化するときに、マネージコードを実行することについて、あいまいで非常に役に立たないメッセージが表示されました。
「this」をテストしようとしましたが、メモリが割り当てられているためNULLではありません。コンストラクタが呼び出されていないため、メモリが不確定な状態になっています。
コンパイラがこれがいつ発生するかを検出するためにデバッグコードに固執すると思っていたでしょうが、そうではないと思います。
この状況を検出するために使用できるアサーション、テスト、またはコンパイル時の切り替えはありますか、それとも「痛い場合は実行しないでください」という結果になりますか?
OUTPUT:
(NULL)
test
#include "stdafx.h"
#include "cstring"
class Apple
{
char *sometimesinitialized;
public:
Apple () {
sometimesinitialized = new char[15];
strcpy_s(sometimesinitialized, 5, "test");
};
void test()
{
printf("%s\n", sometimesinitialized);
}
};
class Ball
{
public:
Ball();
};
Ball b1; // OOPS!
Apple a;
Ball b2; // Works as expected
Ball::Ball()
{
a.test();
}
int _tmain(int argc, _TCHAR* argv[])
{
scanf_s("%i");
return 0;
}