我正在使用VLD來檢測我正在用C++編寫的遊戲中的內存泄漏。它直到最近才報告沒有泄漏。我有一個SettingsManager類(所有靜態方法)加載設置並可以保存它們(文件I/O)。以下是我會的「鍵=值」設置的列表加載到一個載體:爲什麼我有內存泄漏?
std::vector<Setting*> settings;
SettingsManager::loadFromFile(settingsLocation + "display" + settingsExtension, settings);
這個載體填寫正確,我可以進一步處理數據。
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;
}
所以,這個分配設置(這是一個簡單的結構具有兩個的std :: string變量):在loadFromFile()方法被執行如下。
SettingsManager::deleteSettings(settings);
其被實現如下::
當調試時,deleteSettings後呼叫在向量的所有元素我從那裏我調用loadFromFile方法用下面的方法調用刪除它們是壞Ptr的(Visual Studio 2010 Express)。如果我在刪除語句之後給它分配NULL,它們都是NULL。所以我真的沒有理由爲什麼這會給我內存泄漏。
任何人有想法?謝謝!
使用'std :: unique_ptr',這個問題神奇地修復了它自己,或者變成了一個編譯器錯誤,它可以幫助你手動修復它。 –
我們可能需要查看類「Settings」的頭部以及其析構函數的代碼。 – jdehaan
我不知道答案,這可能是誤報。但是你可以做一件簡單的事情。不要使用指針!如果你只是'std :: vector'而不是'std :: vector '那麼肯定不會有任何泄漏。我看不出有什麼好的理由來使用指針。 –
john