C++ で作成しているゲームで、VLD を使用してメモリ リークを検出しています。ごく最近まで、漏れはまったく報告されていませんでした。設定をロードして保存できる SettingsManager クラス (すべての静的メソッド) があります (ファイル I/O)。「キー=値」設定のリストをベクターにロードする方法は次のとおりです。
std::vector<Setting*> settings;
SettingsManager::loadFromFile(settingsLocation + "display" + settingsExtension, settings);
このベクトルは正しく入力されており、データをさらに処理できます。loadFromFile() メソッドは次のように実装されます。
std::ifstream file;
file.open(filename);
if(file.is_open())
{
std::string line;
unsigned pos;
while(file.good())
{
Setting* s = new Setting;
getline(file, line);
if(line.empty())
{
// do not read empty lines
continue;
}
// parse to Setting
pos = line.find('=');
s->key = line.substr(0, pos);
s->value = line.substr(pos + 1);
// add to vector
settings.push_back(s);
}
file.close();
return true;
}
else
{
return false;
}
したがって、これは Settings (2 つの std::string 変数を持つ単純な構造体) を割り当てます。次のメソッド呼び出しで loadFromFile メソッドを呼び出した場所からそれらを削除します。
SettingsManager::deleteSettings(settings);
これは次のように実装されます。
void SettingsManager::deleteSettings(std::vector<Setting*>& settings)
{
for(std::vector<Setting*>::iterator it = settings.begin(); it != settings.end(); ++it)
{
delete (*it);
}
}
デバッグすると、deleteSettings 呼び出しの後、ベクター内のすべての要素が Bad Ptr (Visual Studio 2010 Express) になります。delete ステートメントの後に *it に NULL を割り当てると、それらはすべて NULL になります。したがって、これがメモリリークを引き起こしている理由は本当にわかりません。
誰にもアイデアがありますか?ありがとう!