Windowsで正規表現、そしてメモリリーク
2010年12月24日 コンピュータ今、C言語で書かれたUNIXのプログラムをWindowsに移植する仕事をしています。
その中で正規表現について、IEのCOMコンポーネントを使うとかGNU Cライブラリを使うとか意見が出たが、tr1を使って実装することになりました。
以下にサンプルソースを載せます。なお、移植するプログラムが最低限動けばよいという方針であちこち端折ってます。C言語スタイルなのはプロジェクトの都合です。
ちなみに開発環境はWindows 7(64bit)+Visual Studio 2010。
メモリリーク用にコードを埋め込んでDebugモードでビルドして実行すると、何故かメモリリークが発生する。
ちなみに、regcomp()の一部を以下のように修正すると、メモリリークしなくなる。なぜ?!
(*preg)->rgx = std::tr1::regex(regex, reg_opt);
その中で正規表現について、IEのCOMコンポーネントを使うとかGNU Cライブラリを使うとか意見が出たが、tr1を使って実装することになりました。
以下にサンプルソースを載せます。なお、移植するプログラムが最低限動けばよいという方針であちこち端折ってます。C言語スタイルなのはプロジェクトの都合です。
ちなみに開発環境はWindows 7(64bit)+Visual Studio 2010。
// ここからヘッダファイルの記述
#include
#include
#include
#include
#include
#define ERRMSG_SIZ 256
#define REG_EXTENDED 1
#define REG_ICASE (REG_EXTENDED err_msg, ex.what(), ERRMSG_SIZ);
ret = REG_BADPAT;
}
return ret;
}
void regfree(regex_t *preg)
{
if (preg == NULL || *preg == NULL) {
return;
}
(*preg)->rgx.~basic_regex();
free(*preg);
*preg = NULL;
return;
}
int regexec(const regex_t *preg, const char *string, size_t nmatch, regmatch_t pmatch[], int eflags)
{
int ret = -1;
if (preg == NULL || *preg == NULL || string == NULL) {
return REG_BADPAT;
}
try {
ret = regex_search(std::string(string), (*preg)->rgx);
if (ret) {
ret = 0;
} else {
ret = REG_NOMATCH;
}
} catch (const std::tr1::regex_error &ex) {
strncpy_s((*preg)->err_msg, ex.what(), ERRMSG_SIZ);
ret = REG_BADPAT;
}
return ret;
}
// ここまでcppファイルの記述
メモリリーク用にコードを埋め込んでDebugモードでビルドして実行すると、何故かメモリリークが発生する。
ちなみに、regcomp()の一部を以下のように修正すると、メモリリークしなくなる。なぜ?!
(*preg)->rgx = std::tr1::regex(regex, reg_opt);
コメント