MFCアプリケーションでメモリリークを助けることができる人はいますか?プログラムは、次のコードブロックなしで正常に動作するようです。ブロックには、いくつかのタスクの条件付き実行とデータのMFCダイアログデータメンバーへの通過が含まれ、MFCダイアログのインジケータが更新されます。他のテストでは、デバッグウィンドウにメモリリークメッセージがあることを除いて、すべて正常に動作していることがわかります。プラットフォーム:WIN 7 64bit、MSVC 2011.ありがとう!スレッドを使用したMFCアプリケーションでのメモリリーク
#include <vector>
#include <thread>
//Implementation parallel tasking
void CMASTERDlg::OnCompositeParalleltasking()
{
const int totTsk=8;
BOOL select[totTsk]={
m_Parallel_Audio,
m_Parallel_DDS,
m_Parallel_HV,
m_Parallel_Monitor,
m_Parallel_PDA,
m_Parallel_Pulnix,
m_Parallel_Supertime,
m_Parallel_Temp};
//Put all selected tasks in a thread vector
std::vector<std::thread> threads;
auto pvThread = threads.begin();
if (m_Parallel_Audio)
threads.push_back(std::thread(Audio, 1));
if (m_Parallel_DDS)
threads.push_back(std::thread(DDS, 1, 1));
if (m_Parallel_HV)
threads.push_back(std::thread(HVgetShow, this, 3));
if (m_Parallel_Monitor)
threads.push_back(std::thread(MonitorgetShow, this));
if (m_Parallel_PDA)
threads.push_back(std::thread(PDAgetShow, this));
if (m_Parallel_Pulnix)
threads.push_back(std::thread(DoNothing, 1));
if (m_Parallel_Supertime)
threads.push_back(std::thread(MMCS,Sequence_id, static_cast<LPCSTR>(CStringA(loopnum))));
if (m_Parallel_Temp)
threads.push_back(std::thread(TempgetShow,this));
pvThread = threads.begin();
while (pvThread != threads.end())
{
pvThread->join();
pvThread++;
}
//update data on front panel
UpdateData(FALSE);
UpdateWindow();
//count selected tasks and output message
int j=0, count=0;
for(j=0; j<totTsk; j++) {
if (select[j]) count++;
}
char buffer[2];
itoa (count,buffer,10);
string message=string(buffer)+" tasks completed in parallel\n";
TRACE(message.c_str()); //Message in debugging window
}
投稿されたコードにメモリ割り当てがないように見えるので、起動したスレッドの1つで実行される関数の1つでメモリリークが発生する可能性はほとんどありません。 – Chad
@ChadThanksチャド。私はちょうど1つのスレッドと以下のような単純なdo-nothing関数を使ってコードをテストし、同様のメモリリークを見たので、設定が間違っていたのか不思議でした。実装の最後に、予想よりも早く予期したメッセージが出てしまったのも不思議でした。 void DoNothing()// test function { \t // do nothing } – eLions
追加したスレッドは、MFCダイアログのスレッドと競合しているようです。ところで、コードブロックは非GUIプロジェクトの下でうまく動作することができます。 – eLions