1

コンボボックスとピクチャボックスがあるアプリケーションで作業しています。ユーザーがパスを選択すると、コンボボックスは 2000 個の画像へのパスを読み込み、最初の画像を表示します。ユーザーがコンボボックスのインデックスを変更すると、表示される画像が変更されますが、ピクチャボックス内の画像を削除する方法がわかりません。

イメージを上書きするだけでは、メモリが原因でプログラムがクラッシュするため、繰り返し実行すると機能しません。ピクチャボックス内の画像を削除するにはどうすればよいですか?

編集: 私はいくつかの変更を加えましたが、エラーを再び再現できないようです..おそらくそれは何か他のものでした. しかし、確認のために、このコードはメモリリークを起こしていますか?

ヒント: config は、いくつかの情報 (この場合は画像の場所) を含むシングルトンです。

private: System::Void comboBox_image1_SelectedIndexChanged(System::Object^  sender, System::EventArgs^  e) {
         System::String^ aux;
         DIC_config* config=DIC_config::Instance();
         if(config->images_path!=NULL){
             aux=gcnew System::String(config->images_path);
             aux=aux+"\\CAM_0\\Snap_0_0"+(this->comboBox_image1->SelectedIndex+1)+".bmp";
             System::IO::FileStream^ image_file=gcnew System::IO::FileStream(aux,System::IO::FileMode::Open,System::IO::FileAccess::Read);
             System::Drawing::Bitmap^ img = gcnew System::Drawing::Bitmap(image_file);
             this->pictureBox_image1->Image=img;
             //img->~Bitmap(); this doesnt work, deletes the image of picturebox and makes the program chrash
        }

     }
4

3 に答える 3

3

古いイメージを破棄する必要があります。これを忘れると、ガベージ コレクターが十分な頻度で実行されないときに、プログラムがアンマネージ メモリを使い果たしてしまう可能性があります。Bitmap オブジェクトは非常に小さいため、GC をトリガーすることなく何千ものオブジェクトを割り当てることができますが、ピクセル データ用に大量のアンマネージ メモリを消費する可能性があります。C++/CLI で削除演算子を使用してオブジェクトを破棄すると、IDisposable::Dispose() が呼び出されます。

使用する FileStream も使い捨てオブジェクトであることに注意してください。この方法では、ビットマップが使用されている間はストリームを開いたままにし、後で閉じる必要があります。ストリームを正しく破棄しませんでしたが、閉じるのを忘れました。ファイル パスの文字列を受け入れる Bitmap コンストラクターを使用する方がはるかに簡単で、Bitmap クラスが基になるストリーム自体を管理します。修理:

  aux = config->images_path;
  aux += ....;
  System::Drawing::Bitmap^ img = gcnew System::Drawing::Bitmap(aux);
  delete this->pictureBox_image1->Image;
  this->pictureBox_image1->Image = img;
于 2013-03-11T11:05:17.320 に答える
2

インスタンスではなくクラスのデストラクタを呼び出そうとしているため、これは機能しません。さらに、ガベージコレクターの制御下でそのまま呼び出す必要がないSystem::Drawing::Bitmapため、ファイナライザー(!Bitmap())は、参照されなくなった場合に自動的に呼び出されます。

ピクチャーボックスで閉じたい場合にできることは

delete this->pictureBox_image1->Image;
image_file->Close(); //after closing/deleting the open bitmap

ところで。あなたのコードは純粋なc++ではなくc++/ cliなので、タグを追加しました

于 2013-03-11T11:06:20.653 に答える