저는 C++로 작성한 게임에서 메모리 누수를 감지하기 위해 VLD를 사용하고 있습니다. 아주 최근까지 누출이 전혀보고되지 않았습니다. 설정을로드하고 저장 (파일 I/O) 할 수있는 SettingsManager 클래스 (모든 정적 메서드)가 있습니다. 저는 여기 벡터에 "키 = 값"설정 목록을로드 할 방법은 다음과 같습니다메모리 누수가 발생하는 이유는 무엇입니까?
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;
}
그래서,이 (두 표준 : 문자열 변수와 간단한 구조체이다) 설정을 할당 다음과 같이 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 후 벡터의 모든 요소를 호출 나는 다음과 같은 메소드 호출로 loadFromFile 메소드를 호출 곳에서 삭제 Bad Ptr (Visual Studio 2010 Express)입니다. 만약 delete 문 뒤에 * NULL을 할당하면 모두 NULL입니다. 그래서 정말로 메모리 누수가 발생하는 이유는 없습니다.
누구나 아이디어가 있으십니까? 감사!
'std :: unique_ptr'을 사용하면 마술처럼 스스로 수정되거나 컴파일러 오류가되어 수동으로 수정하는 데 도움이됩니다. –
아마도'Settings' 클래스의 헤더와 그 소멸자의 코드를 볼 필요가있을 것입니다. – jdehaan
나는 그 답을 모른다. 거짓 긍정일지도 모른다. 그러나 당신이 할 수있는 쉬운 일이 있습니다. 포인터를 사용하지 마십시오! 'std :: vector'이 아니라면'std :: vector '이 아니고 누수가 전혀 없을 것입니다. 이 포인터를 사용하는 좋은 이유를 볼 수 없습니다. –
john