[pochy-user] メモリリークの報告

Back to archive index

isr(nya_mo_nya) nya_mo_nya****@ybb*****
2003年 9月 12日 (金) 00:19:30 JST


こんにちは。isrです。
xkenさん、平中さん、親切な回答ありがとうございます。

> isrさん、もしかしてPochyと連携するソフトを何か作っておられて、
> Pochyのメインウィンドウを検索する必要性があったりしますか?

ごめんなさい。作ってません。m(_ _)m
ウィンドウクラス名の採用はズバリ『なんとなくカッコいいから』です!!
(すいません)

> たぶんペインをFormViewのサイズに合わせるには次のコードでいけそうです。
> 自身が無いので、正しい方法がわかる方がいたら教えてください(^^;

知らない関数だったのでヘルプを見ましたが、
僕も問題無いと思います。


というわけで件名の報告です。
codeprojectで拾ってきたソースでチェック掛けたところ、
メモリリークがありました。 >_<
http://www.codeproject.com/tools/leakfinder.asp
(次のメールでプロジェクトへの追加手順書きます。
 今回の報告メールは結構長いです)


起動して、執筆→何もせずに終了→『保存しますか』と聞かれるので『はい』。
6: \regex.cpp(1912) +7 bytes (_re_compile_pattern)
6: \regex.cpp(5546) +30 bytes (_regcomp)
6: \HeaderInfo.cpp(96) +20 bytes (CHeaderInfo::Analyze)
6: \HeaderInfo.cpp(79) +0 bytes (CHeaderInfo::DoIt)
6: \SummaryView.cpp(730) +0 bytes (CSummaryView::SaveMail)
以下、結構たくさんあるので省略^^;

で、
 regex_t reg;
を使うなら
 regfree(&reg) ;
をしなきゃいけないようです。
(参考
 http://www.sip.eee.yamaguchi-u.ac.jp/kou/regex.html

http://216.239.57.104/search?q=cache:bp1HHi_K9vMJ:bama.ua.edu/cgi-bin/man-cgi%3Fregcomp%2B3C++regcomp+regex_t+man+regfree&hl=ja&ie=UTF-8&inlang=ja
)

なので、regfree(&reg)を呼んだら

\HeaderInfo.cpp(185) : error C2660: 'regfree' : 関数が不正な 1 個の実引数を
ともなって呼び出されました。

と怒られました。
_regex.hをみると
extern void regfree _RE_ARGS ((regex_t *preg));

#if __STDC__
#define _RE_ARGS(args) args
#else /* not __STDC__ */
#define _RE_ARGS(args) ()
#endif /* not __STDC__ */

で、よくわからないので、(^^;
regfreeの_RE_ARGSとカッコを外したらコンパイルOK。
(ツッコミよろしくです)

以下は regfree(&reg) ; を追加した関数になります。

一文足しただけでOK
(CHeaderInfo::AnalyzeCD)
(CHeaderInfo::ReformDate)



(CHeaderInfo::Analyze)はちょっと追加、変更

int RegWrap(char *a_pc, const CString a_sField)
{
 int iExecRet;
 regex_t reg;
 regcomp(&reg, a_sField, REG_EXTENDED | REG_NEWLINE | REG_ICASE);

 iExecRet = regexec(&reg, a_pc, 0, NULL, 0) ;
 regfree(&reg) ;
 return iExecRet ;
}

みたいなのをその上にでも置いて



  if(!RegWrap("^subject:", field)){
   m_subject = m_decoded_header[i].Mid(strlen("Subject:"));
   g_cstr_chop(m_subject);
   continue;
  }

  if(!RegWrap("^cc:", field)){
   m_cc = m_decoded_header[i].Mid(strlen("cc:"));
   g_cstr_chop(m_cc);
   continue;
  }

  if(!RegWrap("^bcc:", field)){
   m_bcc = m_decoded_header[i].Mid(strlen("bcc:"));
   g_cstr_chop(m_bcc);
   continue;
  }
  if(!RegWrap("^from:", field)){
   m_from = m_decoded_header[i].Mid(strlen("from:"));
   g_cstr_chop(m_from);
   continue;
  }

  if(!RegWrap("^to:", field)){
   m_to = m_decoded_header[i].Mid(strlen("to:"));
   g_cstr_chop(m_to);
   continue;
  }

  if(!RegWrap( "^x-mailer:", field)){
   m_xmailer = m_decoded_header[i].Mid(strlen("x-mailer:"));
   g_cstr_chop(m_xmailer);
   continue;
  }
  if(!RegWrap("^reply-to:", field)){
   m_replyto = m_decoded_header[i].Mid(strlen("reply-to:"));
   g_cstr_chop(m_replyto);
   continue;
  }
  if(!RegWrap("^date:", field)){
   m_date = ReformDate(m_decoded_header[i]);
   continue;
  }
  if(!RegWrap("^content-transfer-encoding:", field)){
   CString cte;
   m_cte = m_decoded_header[i];
   m_cte.TrimRight("\r\n");
   cte = m_decoded_header[i].Mid(strlen("Content-Transfer-Encoding:"));
   g_cstr_chop(cte);
   if(g_cstr_compare(cte.GetBuffer(0), "7bit"))
    m_enc = SEVEN_BIT;
   if(g_cstr_compare(cte.GetBuffer(0), "8bit"))
    m_enc = EIGHT_BIT;
   if(g_cstr_compare(cte.GetBuffer(0), "bin"))
    m_enc = BIN;
   if(g_cstr_compare(cte.GetBuffer(0), "base64"))
    m_enc = BASE64;
   if(g_cstr_compare(cte.GetBuffer(0), "x-gzip64")) // x-gzip64は取りあえず
base64にしとく(zlib.dllが必要だそうな)
    m_enc = BASE64;
   if(g_cstr_compare(cte.GetBuffer(0), "quoted-printable"))
    m_enc = QUOTED_PRINTABLE;
   continue;
  }
  if(!RegWrap("^message-id:", field)){
   m_msg_id = m_decoded_header[i].Mid(strlen("Message-ID:"));
   g_cstr_chop(m_msg_id);
   continue;
  }
  if(!RegWrap("^in-reply-to:", field)){
   m_in_reply_to = m_decoded_header[i].Mid(strlen("In-Reply-To:"));
   g_cstr_chop(m_in_reply_to);
   continue;
  }
  if(!RegWrap("^content-type:", field)){
   m_ct = m_decoded_header[i];
   g_cstr_chop(m_ct);
   AnalyzeCT();
   continue;
  }
  if(!RegWrap("^content-disposition:", field)){
   m_cd = m_decoded_header[i];
   g_cstr_chop(m_cd);
   AnalyzeCD();
   continue;
  }


(CHeaderInfo::AnalyzeCT)
 // regexec後に全てに追加
 regfree(&reg) ;

BOOL g_cstr_compare(LPCTSTR c, LPCTSTR d)
 int iRet = regexec(&reg, d, 2, pmatch, 0) ;
 regfree(&reg) ;
 if(0 == iRet)
  return TRUE;
 return FALSE;


色々やったので、絶対正しく必要な処理かどうか微妙に迷うところですが、
まあこんな感じということで。^^;
本当はregcompの返り値も見たほうがよさそうですね・・・

とりあえず、見つけたところだけ報告しました。
以上です。

isr****@users*****




pochy-user メーリングリストの案内
Back to archive index