質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

2068閲覧

メモリ消費量がうなぎのぼりで困っております。

yymedi

総合スコア9

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/06/23 06:30

編集2019/06/23 06:55

初心者です。VC++でODBC接続してレコードの監視プログラムを作成、メモリ消費量がうなぎのぼりで困っております。

MySQLのレコードをODBCで読みに行くVC++プログラムでtableテーブルになにかレコードができたら処理を行う監視プログラムを作成しました。問題なく動作しているのですが、メモリ消費をみるとselectがかかるたびにメモリがぐんぐん増えてゆきます。
メモリリークというか、そもそものプログラムの手段が間違っているのでしょうか。ご教示いただけますと幸いです。

VC++

1#define ODBCset2 "Driver=○○○;Server=○○○;DATABASE=○○○;UID=○○○;PWD=○○○;" 2using namespace System; 3using namespace System::Data::Odbc; 4 5int main() 6 while(true){ 7 try { 8 OdbcConnection^ ODB = gcnew OdbcConnection(); 9 ODB->ConnectionString = ODBCset2;// 10 #↓ここからメモリリーク 11 ODB->Open();//ODBCに接続する 12 OdbcCommand^ Cmd = gcnew OdbcCommand("select count(*) from table", ODB); 13 14 15 OdbcDataReader^ read = Cmd->ExecuteReader(); 16 read->Read(); //1行目を読む 17 c_data = read[0]->ToString(); 18 read->Close(); 19 count = int::Parse(c_data);//String^ to int 20 if (count >= 1)#tableにレコードが1つ以上あったら 21 { 22 #処理実行してレコードを削除する 23 } 24 25 ODB->Close(); 26 ODB->ReleaseObjectPool(); 27 delete ODB; 28 ODB = nullptr; 29 30 31 } 32 catch (...) { 33 #接続エラーの表示 34 } 35 } 36} 37

プログラム開始とともに使用メモリは30MBくらいからみるみる増加し、1時間で300MB超えてしまいます。
ODBCをopen()でメモリリークが発生しているようですが、解放がこのコードではできていないようです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

あてずっぽなんですけど、

OdbcCommand^ Cmd = gcnew OdbcCommand("select count(*) from table", ODB);

こいつはdeleteせんでもええんですかね?

あとこいつloopをブン回ってますが、こんなにひっきりなしに回さんならんのですか?
ODBはloopのでgcnewしてよくないですか?

投稿2019/06/23 06:57

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yymedi

2019/06/23 07:22

loop外でODBCをopenにしたところメモリ増加しませんでした!! 頻繁にopen closeをしたい場合があり、その際のメモリ処理の方法がまだ不明です。
episteme

2019/06/23 10:19

ところでこのプログラム、どんな条件で終了するんですか?
yymedi

2019/06/23 10:59

サーバーでの運用を検討しておりまして、基本的には終了させない前提でおります。 sleep()をかけて10sec毎に回そうと思っております。
episteme

2019/06/23 11:30

一発こっきりloopナシのを10秒おきに起動すればメモリ問題解決すんでね?
yymedi

2019/06/23 11:39

仰る通りです。タイムスケジューラや他アプリからの起動で、しのぐしか無いかなと思いました。 今後の知識として、open closeでのメモリ処理が出来ればと思っております。
guest

0

問題解決いたしましたので、ご報告させていただきます。
当方が本プログラムをSystem.Windows.Form.Timerで実行していたのが問題でした。
基本CLRアプリで.Net Frameworkのプログラムを使用する場合はGCは勝手にやってくれるとのことであり、ODBC open closeが問題ではありませんでした。
System.Windows.Form.Timerで回しているとその分のメモリがリークしているようで、問題の首座はそこにありました。

検索してみると同様の問題があるようです。自分としても根本解決には至っておりませんが、何らかの回避策は打てそうです。
System.Windows.Form.Timerのメモリ消費
メモリが解放されていない?

また情報などございましたらアドバイスいただけますと嬉しいです。

投稿2019/06/30 04:25

yymedi

総合スコア9

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問