1

たくさんの画像を取り、それらを 1 つの BMP にオーバーレイするクラスを作成してきました。何らかの理由でコードを実行すると、segfault が発生し、このメソッドまで追跡しました。基本的に、if ステートメントは、この新しい画像を配置する画像の配列に有効なインデックスがあるかどうかを確認します。有効な場合は、以前にあったものをすべて削除し、そのインデックスをこの新しい画像に設定します。クラスは Scene と呼ばれ、Image ポインターの配列で構成されます。だから私がやっていることは、それらのポインタの1つが指している画像を置き換えることです. どういうわけかそれはうまくいきません。ポインターが NULL の場合、delete コマンドは問題を引き起こさないはずなので、何が問題なのかわかりません。このコードは、長さ 5 の Image ポインターの配列を持つシーンで動作しています。

void Scene::addpicture(const char* FileName, int index, int x, int y)
{
 if (index<0 || index>maxnum-1)
 {
  cout << "index out of bounds" << endl;
 }

 else
 {
        Image* extra;
        extra = new Image;
        extra->ReadFromFile(FileName);

        delete imagelist[index];


        imagelist[index] = extra;
        imagelist[index]->xcoord=x;
        imagelist[index]->ycoord=y;
 }
}

誰でも助けることができます。それは大歓迎です。

ありがとう

コンストラクターを含めるように編集しました。

Scene::Scene(int max)
{
Image** imagelist = new Image*[max];
for(int i=0; i<max; i++)
{imagelist[i] = NULL;}

maxnum = max;
}

main メソッドもコメントアウトして、呼び出される関数のみを

Scene* set = new Scene(5);
set->addpicture("in_01.bmp", 0, 0, 0);
4

3 に答える 3

4

コンストラクターにはローカル イメージリストがありますが、addpicture でフィールド イメージリストを使用しています。コンストラクターで imagelist フィールドをシャドーイングしていて、フィールドが初期化されません。

次の行を置き換えて修正します。

Image** imagelist = new Image*[max];

これとともに:

imagelist = new Image*[max];
于 2010-02-09T02:10:44.197 に答える
1

SEGFAULT は、あるべき場所以外の場所にアクセスしようとしていることを意味します。メッサへのコメントで、deleteコマンドで発生していると言っています。

Sceneクラスを構築するとき、ポインターを明示的imagelistに NULL に初期化しますか? つまり、次のような行がありますか。

for (i=0; i<maxnum; i++) {
    imagelist[i] = NULL;
}

コンストラクターで、または初期化されていない配列が0で埋められていると想定していますか? (ほとんどの言語とは異なり、C++ ではその仮定は不適切です。)

于 2010-02-09T02:00:29.737 に答える
0

このコードは問題ないように見えますが、プログラムの他の部分にエラーがあると思います。配列imagelistが初期化されていない可能性がありますNULLか?もしくはmaxnum実寸ではありませんimagelist。または他の何か。

何が失敗しているのか - トレースバックはありますか?

于 2010-02-09T01:47:16.500 に答える