mfc-ml

1999年12月

29

[mfc 21460] メモリ使用量とODBC

お世話になっています。緑川です。
ODBCを使用したアプリケーションを作っています。
(ダイアログベースで、DBアクセスはDLL化しています)

定期的にDBにアクセスして、データが更新されたら、
表示を更新しているのですが、更新を何回もしていると、
アプリケーションのメモリ使用量が少しずつ増えていきます。
(一回の更新で、DBへのアクセスは何回もやっています)

3日ぐらい立ちあげっぱなしだと、メモリ使用量が巨大になって
アプリケーションが暴走します。

これを回避する方法はあるのでしょうか。

ちなみに、BoundsCheckerで見たところ、アプリケーション終了時に
メモリリークとリソースリークがかなりありました。
しかし、自分が作ったソースでメモリを解放していない部分は修正済み
(のはず)です。
とりあえず、BoundsCheckerで出てきたメモリリークとリソースリークの部分は
以下のものがありました。

・メモリリーク
afxtls.cpp(283),(76), (180)
ccdata.cpp(668)
winhand.cpp(75)
crtdll.c(170)
dllinit.cpp(471), (544)
apprint.cpp(135), (146), (165), (197)
dllole.cpp(120)
dlldb.cpp(96)
viewprint.cpp(432)
wincore.cpp(268)
wingdi.cpp(996)
・リソースリーク
dllinit.cpp(368), (487)
afxcrit.cpp(54), (105)
afxmt.inl(38)
afxtls.cpp(122), (126)
dllole.cpp(55)
dlldb(59), (60)
auxdata.cpp(188)

環境は、WinNT4.0(SP3)+VC5.0+ACCESSです。
どなたか、ご存じの方、ご教授お願いいたします。
29

[mfc 21459] Re: 文字の判別(漢字、カタカナ、ひらがな)

 こんにちは。Imabeppu です。

1999/12/29 20:14:03 (Japan)
In message "[mfc 21458] Re: 文字の判別(漢字、カタカナ、ひらがな) "
Imabeppu <i...@osl.fujitsu.co.jp> wrote:

>                   unsigned int nMBC = MAKEWORD(a[1], a[0]);

 もちろん、
    unsigned int nMBC = MAKEWORD(word[1], word[0]);
でもいいですし
    unsigned int nMBC = MAKEWORD(text[i + 1], text[i]);
でもいいですよ。

--
|=====  ∧ ∧  =====  IMABEPPU, Shinya  =====================|
|==  n(=⌒-⌒=)n  ==  http://member.nifty.ne.jp/imabeppu/  ==|
29

[mfc 21458] Re: 文字の判別(漢字、カタカナ、ひらがな)

 こんにちは。Imabeppu です。
 失礼しました。私の回答は間違っていました。

# 以下は _T() を付けずに書いています。時間があったら _T について
# も調べてみるとよいですよ。

1999/12/29 19:31:46 (Japan)
In message "[mfc 21457] Re: 文字の判別(漢字、カタカナ、ひらがな) "
shinya <s...@isl.hiroshima-u.ac.jp> wrote:

>     CString text="",word="";
:
>     text="ビジュアルC++" + '\0';

 これは変です。'\0' は終端を付けようとしているのでしょうか?
CString はそのあたりを内部でめんどう見てくれるので付けなくてよい
です。
      text="ビジュアルC++";

 ちなみに、文字列を連結するときに LPCTSTR と LPCTSTR を足し合わ
せるとポインタの足し算になってしまいます。どちらかが CStringでは
ないといけないですのでご注意を!

>                 if(_ismbckata(word[0]))

 ここで、2バイト文字の1バイト目を渡しているのですが、間違いでし
た。以下のようにしなければなりません。

                  unsigned int nMBC = MAKEWORD(a[1], a[0]);
                  if(_ismbckata(nMBC))

 失礼しました。

--
|=====  ∧ ∧  =====  IMABEPPU, Shinya  =====================|
|==  n(=⌒-⌒=)n  ==  http://member.nifty.ne.jp/imabeppu/  ==|
29

[mfc 21457] Re: 文字の判別(漢字、カタカナ、ひらがな)


Imabeppuさん、早速レスありがとうございました。
教えて頂いた方法でやってみましたが、_ismbckataの戻り値が0になってしまい、
if文の中に入っていきません。
下に僕が作ったプログラムをのせるので、おかしいところがあったら
御指摘お願いします。

CString text="",word="";
int i,len;
char a[3],crlf[]="\x0d\x0a";

text="ビジュアルC++" + '\0';
len=text.GetLength();
for(i=0;i<len;i++){
if(IsDBCSLeadByte(text[i])){
a[0]=text[i];
a[1]=text[i+1];
a[2]='\0';
i++;

word=a;

if(_ismbckata(word[0]))
m_textword=m_textword + word + "[2バイトカタカナ]" + crlf;
}
else
m_textword=m_textword + text[i] + "[1バイト]" + crlf;
}
UpdateData(FALSE);

頑張って作ったプログラムです。
よろしくお願いします。
29

[mfc 21456] Re: C 言語文法の問題です。


ども。おうみです。


for(i=0; i<6; i++){
  printf("%d番=",i+1);
  scanf ("%d",&tensuu[i]);
 }

 for(i=0; i<6; i++){
  if(tensuu[i]==50)
   break;
 }

 if(i==6)
  puts("50点の学生はいません。");
 else
  printf("50点の学生の学籍番号は%dです。\n",i+1);

始めのfor文①ですが、ここでは6人分の入力が全て
完了しなければ、それ移行の②以下のプログラムには入りません。
よってここで50点を入力しようが、終わる事はないです。
for文というのは、例えば仮に
/////////
int X=0;
for(i=0; i<6; i++){X+=1;}
/////////
とあった場合、{X+=1;}の式を、iが0から5になるまでの間計6回ループし、
そのループしている間はそれ以下のプログラムには移らないです。
また、for文の途中にbreak文があると、ループの途中でも中断し、
それ以下のプログラムには移行するです。
②の式では 
if(tensuu[i]==50)
break;
という式を、iに合わせてtensuu[0]~tensuu[5]までをチェック、
もしも50の値であったならば途中でもループを中断して③
のプログラムに移行するです。
よって③に入ったときにiが6であるという事は、tensuu[0]~tensuu[5]
間に50の値がなかったということになるです。
50の値があったならば、iはもっと若い値のはずです。
記事検索
Amazon.co.jp
  • ライブドアブログ