teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

3

コード更新

2019/06/23 06:55

投稿

yymedi
yymedi

スコア9

title CHANGED
File without changes
body CHANGED
@@ -3,7 +3,7 @@
3
3
  MySQLのレコードをODBCで読みに行くVC++プログラムでtableテーブルになにかレコードができたら処理を行う監視プログラムを作成しました。問題なく動作しているのですが、メモリ消費をみるとselectがかかるたびにメモリがぐんぐん増えてゆきます。
4
4
  メモリリークというか、そもそものプログラムの手段が間違っているのでしょうか。ご教示いただけますと幸いです。
5
5
 
6
- ```
6
+ ```VC++
7
7
  #define ODBCset2 "Driver=○○○;Server=○○○;DATABASE=○○○;UID=○○○;PWD=○○○;"
8
8
  using namespace System;
9
9
  using namespace System::Data::Odbc;
@@ -13,6 +13,7 @@
13
13
  try {
14
14
  OdbcConnection^ ODB = gcnew OdbcConnection();
15
15
  ODB->ConnectionString = ODBCset2;//
16
+ #↓ここからメモリリーク
16
17
  ODB->Open();//ODBCに接続する
17
18
  OdbcCommand^ Cmd = gcnew OdbcCommand("select count(*) from table", ODB);
18
19
 
@@ -42,4 +43,5 @@
42
43
 
43
44
  ```
44
45
 
45
- プログラム開始とともに使用メモリは30MBくらいからみるみる増加し、1時間で300MB超えてしまいます。
46
+ プログラム開始とともに使用メモリは30MBくらいからみるみる増加し、1時間で300MB超えてしまいます。
47
+ ODBCをopen()でメモリリークが発生しているようですが、解放がこのコードではできていないようです。

2

コードの更新

2019/06/23 06:55

投稿

yymedi
yymedi

スコア9

title CHANGED
File without changes
body CHANGED
@@ -22,9 +22,9 @@
22
22
  c_data = read[0]->ToString();
23
23
  read->Close();
24
24
  count = int::Parse(c_data);//String^ to int
25
- if (count >= 1)
25
+ if (count >= 1)#tableにレコードが1つ以上あったら
26
26
  {
27
- #処理
27
+ #処理実行してレコードを削除する
28
28
  }
29
29
 
30
30
  ODB->Close();
@@ -35,7 +35,7 @@
35
35
 
36
36
  }
37
37
  catch (...) {
38
- MessageBox::Show("接続エラー");
38
+ #接続エラーの表示
39
39
  }
40
40
  }
41
41
  }

1

コードの更新

2019/06/23 06:36

投稿

yymedi
yymedi

スコア9

title CHANGED
File without changes
body CHANGED
@@ -5,6 +5,8 @@
5
5
 
6
6
  ```
7
7
  #define ODBCset2 "Driver=○○○;Server=○○○;DATABASE=○○○;UID=○○○;PWD=○○○;"
8
+ using namespace System;
9
+ using namespace System::Data::Odbc;
8
10
 
9
11
  int main()
10
12
  while(true){