プロが教えるわが家の防犯対策術!

前略
・.NET 2012のVC++を使っています。 ファイルをオープンするプログラムをつくろうとしています。その過程でダイアログをオープンするプログラムをネットにあったC#のコードを参考に、openFileDialog1->Dispose();をコメントアウトした以下に示すものをつくりました。このコードは特に問題なくコンパイルできて動作します。
 しかし、C#のコードにあった openFileDialog1.Dispose();から変更したopenFileDialog1->Dispose();を追加すると
"error C2039: 'Dispose' : 'System::Windows::Forms::OpenFileDialog' のメンバーではありません。"と云うエラーメッセージがでてコンパイルできません。
<質問>
 VC++の場合 C#のopenFileDialog1.Dispose();に相当するオブジェクト破棄のコードは不要なのでしょうか?
 もし、破棄が必要なのであればどのようなコードを書けばよいのでしょうか?

 どなたかお分かりになる方、ご教示いただければ幸いです。


以上、よろしくお願いします。

//-------------------------------------------------------
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)
{
OpenFileDialog^ openFileDialog1 = gcnew OpenFileDialog();//new OpenFileDialog();

openFileDialog1->Title = "ダイアログのタイトルをココに書く";

openFileDialog1->InitialDirectory = "c:\\";

openFileDialog1->FileName = "初期表示するファイル名をココに書く";

if (openFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK)
MessageBox::Show(openFileDialog1->FileName);

// 不要になった時点で破棄する (正しくは オブジェクトの破棄を保証する を参照)
// openFileDialog1->Dispose();

};

A 回答 (2件)

近年 C++/CLI 触っていないのでうろ覚えですが、C++/CLI では openFileDialog1->Dispose() を呼び出すのに delete を使うんだったと記憶しています。



delete openFileDialog;

gcnew との対称性を重んじたのでしょうね。ダイアログは unmanaged resource なので、CLR がよろしくやってくれるという事はありませんよ。openFileDialog が GC に回収されるまでリソースが残ってしまいます (まあ、それでも良いという態度もあるかも知れませんが、個人的には気持ち悪いです…)。

因みに、構文糖衣ですが ^ を付けずに (あたかも値型の様に) 宣言すると、C# の using と同等のコードを生成してくれます。つまり、自動的にスコープの終端で delete (Dispose) してくれます。

{
OpenFileDialog openFileDialog1;
openFileDialog1.Title = "ダイアログのタイトルをココに書く";
openFileDialog1.InitialDirectory = "c:\\";
openFileDialog1.FileName = "初期表示するファイル名をココに書く";
if (openFileDialog1.ShowDialog() == System::Windows::Forms::DialogResult::OK)
MessageBox::Show(openFileDialog1.FileName);
}
    • good
    • 0
この回答へのお礼

前略
・さっそくご教示ありがとうございます。
 openFileDialog1->Dispose(); を delete openFileDialog1; に変更したらコンパイルできました。

・糖衣構文については、まったくしりませんでした。コンパイルして実行を確認しました。勉強になりました。

今後ともよろしくお願いします。


以上

お礼日時:2013/10/31 09:48

CLIは触っていませんが……。



>VC++の場合 C#のopenFileDialog1.Dispose();に相当するオブジェクト破棄のコードは不要なのでしょうか?

CLRがよろしく処理してくれる…ようです。
まぁ、即座に破棄したい場合はその限りではないようですが。

参考URL:http://fireball.loafer.jp/kes/article_558.html
    • good
    • 0
この回答へのお礼

前略
・ さっそく ご教示ありがとうございました。
  しばらくするとCLRが処理してくれるようですが、delete openFileDialog1;で即座に終了処理することとしました。

 今後ともよろしくお願いします


以上

お礼日時:2013/10/31 09:52

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!