2013-03-28 2 views
2

저는 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입니다. 그래서 정말로 메모리 누수가 발생하는 이유는 없습니다.

누구나 아이디어가 있으십니까? 감사!

+0

'std :: unique_ptr'을 사용하면 마술처럼 스스로 수정되거나 컴파일러 오류가되어 수동으로 수정하는 데 도움이됩니다. –

+0

아마도'Settings' 클래스의 헤더와 그 소멸자의 코드를 볼 필요가있을 것입니다. – jdehaan

+1

나는 그 답을 모른다. 거짓 긍정일지도 모른다. 그러나 당신이 할 수있는 쉬운 일이 있습니다. 포인터를 사용하지 마십시오! 'std :: vector '이 아니라면'std :: vector '이 아니고 누수가 전혀 없을 것입니다. 이 포인터를 사용하는 좋은 이유를 볼 수 없습니다. – john

답변

5

continue 진술로 인해 누출이 1 회 이상 발생합니다. 루프의 시작은 새로운 Setting 값을 할당하고 메모리를 비우지 않고 계속 루프 본문을 벗어납니다. 누출을 막으려면 삭제해야합니다.

Setting* s = new Setting; 
getline(file, line); 
if(line.empty()) { 
    delete s; 
    continue; 
} 

여기서 수동 메모리 관리로 놀고 있어도 오류는 쉽게 발생합니다. 원시 Setting* 대신 shared_ptr<Setting>과 같은 유형을 사용하는 것이 좋습니다. 그것은 당신의 문제가 해결됩니다 루프를 계속 이후에

+0

빠른 답변을 보내 주셔서 감사합니다. shared_ptr은 표준 C++ 또는 Boost와 같은 라이브러리에서 가져온 것입니까? – RaptorDotCpp

+0

@RaptorDotCpp'shared_ptr'은 boost에서 비롯되었지만 이제는 C++ 11의 일부라고 생각합니다. – JaredPar

+0

Ok, 확실히 확인해 보겠습니다 – RaptorDotCpp

0

이동 귀하의 코드를 훨씬 더 강력한

Setting* s = new Setting; 

를 만들 것입니다.

편집 :

더 자세히 설명하겠습니다. 현재 빈 줄까지 모든 줄마다 새 설정 개체를 만들고 있습니다. 그러나 비어 있지 않은 줄에 대한 설정 개체 만 컨테이너에 저장됩니다. 컨테이너는 나중에 메모리를 해제하는 데 사용한다고 가정합니다.

빈 줄을 계산하는 문 뒤에 설정 개체를 만드는 코드를 배치하면이 문제를 해결할 수 있습니다.

+0

감사합니다. – RaptorDotCpp

관련 문제