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

私はいま、高校の課題研究でvc++2010でソフトの製作をしています。

原因のわからないエラーの理由を探るため、よく理解もしていないデバックのブレークポイントを駆使して変数の中身を見て回っているのですが、時折「自動変数」の欄にも「ローカル変数」の欄にも表示されない変数があります。

あれは、どういった理由で表示されないのでしょうか。

ソースすべては長いので載せませんが、問題の部分だけ載せておきます。

char *p;
char *result;
p = (char*)System::Runtime::InteropServices::Marshal:: StringToHGlobalAnsi(data[i]).ToPointer();

//Mecabインスタンスの作成
MeCab::Tagger *tagger = MeCab::createTagger ("");
result = (char*)tagger->parse(p); //←形態素解析されたデータを格納しているのですが、エラーが起こるような処理ではないと思います。
delete tagger;

System::Runtime::InteropServices::Marshal::FreeHGlobal(IntPtr(p));
String^ SResult = gcnew String(result); //←ここで「ハンドルされていない例外」が入り、デバックが中断されます
MessageBox::Show(SResult);


resultの中身を見たいのですが、表示されません。
ソースのコメント分のあたりにブレークポイントを入れたときには、*pに正常に値が入っていることが確認できました。

例外が発生したときのメッセージウィンドウの表記
「'System.AccessViolationException' のハンドルされていない例外が guiapp.exe で発生しました。

追加情報: 保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。」


よくばりですが、例外が発生した原因についても気が付くことがありましたら指摘してください。

わかりづらい文章で申し訳ないですが、よろしくお願いします。

A 回答 (3件)

resultが未初期化。


ってのが表示されない・例外双方の原因でしょう。
    • good
    • 0

result = (char*)tagger->parse(p);


delete tagger; ★

taggerがdeleteされたので、そこから返された
resultが指している空間も無効になったと
思います。それで、中身も見えないし、使えば
エラーになるのでしょう。
MessageBoxの後までtaggerをdeleteしない
ようにすれば解決するのでは?
    • good
    • 0
この回答へのお礼

ご指摘の通りでした。
表示されないのは、参照先が無かったからだったんですね。

ありがとうございました。

お礼日時:2012/01/14 11:28

Mecab::Tagger::Parseのリファレンスを見ると、


http://mecab.sourceforge.net/doxygen/classMeCab_ …

You should not delete the returned string.
と書いてあるので、Taggerの内部でメモリを確保しているのでしょうね。
後は#2さんのおっしゃる通り、taggerをdeleteした時にメモリが解放され、
その後の参照により、落ちているのでしょう。
    • good
    • 0
この回答へのお礼

resultは他のメモリを見に行ってるだけですもんね。
その対象がなくなればエラー吐くのも道理でした。

ありがとうございました。

お礼日時:2012/01/13 19:17

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