3

(この質問に関連します。)

基本クラスBaseと 2 つの派生クラスがDer1ありDer2ます。(基本的な実装については、リンクされた質問を参照してください。それぞれにいくつかのパブリック プロパティもあります。) 私のプログラムでは、次のBaseような配列を作成します。

Base *array[10];
int count = 0; // program-wide count of how many objects are in the array

その後、次のようにDer1andのインスタンスで埋めます。Der2

Der1 d = Der1();
d.x = 0; // Filling in public properties
d.y = 1;
d.z = 3;
array[count] = &d;
count++;

にほぼ同一のコードが使用されDer2ます。

その後、配列を使用して、これらのクラスで定義された関数を呼び出します。

int result = array[i]->SomeFunction(x, y);

コードは正常にコンパイルされますが、実行しようとすると、「program.exe の 0x00232d60 で未​​処理の例外: 0xC000005: アクセス違反の読み取り場所 0x04064560」が発生します。

アクセスしようとしている配列内のオブジェクトを見ると、すべてのプロパティの値が本来の値ではなく 0.0000 になっています。2 つのdouble型配列もあり、最後のいくつかの要素が初期化されていないように見えます (「1.572398880752e-311#DEN」または「-9.2559631349317831e+061」など)。

私は .NET をあまりにも長く使用しており、ポインターについて知っていたことの多くを忘れてしまいました。これが問題の原因であると想定しています...このエラーを修正する方法について何か提案はありますか?

4

4 に答える 4

6

ローカル変数へのポインターで配列を埋めました。これらは、元のローカル変数がまだ有効である限り有効です。ほとんどの場合、アクセスしようとしているオブジェクトが範囲外にある可能性があります。それらをヒープに割り当ててみて、問題が解決するかどうかを確認してください。

于 2011-02-19T17:53:13.497 に答える
4
Der1 d = Der1();

スタック上にのインスタンスを構築しDer1ます。d呼び出す前に範囲外になると、SomeFunctionアクセス違反が発生します。new を使用して、ヒープ上に Der1 を構築する必要があります。

Der1* d = new Der1();

dインスタンスが不要になった場合、またはプログラムの最後にインスタンスを削除する必要があります。

delete d;
于 2011-02-19T17:54:34.760 に答える
2

以下の後:

Der1 d = Der1();
...
array[count] = &d;

上記のスコープが終了するとすぐに、オブジェクト d は破棄されます。これは、後で次のような方法でアクセスを試みることができないことを意味します。

array[i]->SomeFunction(x, y);

その位置のポインターによって以前に参照されていたオブジェクトはなくなったためです。

于 2011-02-19T17:54:57.283 に答える
1
int result = array[i]->SomeFunction(x, y);

iが 10 未満で、0 以上であることを確認してください。

于 2011-02-19T17:51:02.057 に答える