2014-11-09 3 views
2

나는 실행할 때마다 0.5 MB의 메모리를 사용하는 함수를 가지고있다. 그래서 나는 동시에 Windows 작업 관리자를 보면서 단계별로 조사하기로 결정했습니다. 나는이 줄 뒤에 나타났습니다 :delete []는 C++에서 실제로 작동합니까?

int **banned; 
banned=new int*[vertices]; 
for(i=0;i<vertices;i++) 
    banned[i]=new int[k_colors]; 

0,5 MB 메모리를 사용합니다. 그럼 난 return 라인 전에 삭제하기로 결정

for(i=0;i<vertices;i++) 
    for(j=0;j<k_colors;j++) 
     delete []banned[j]; 
    delete[]banned; 

은 함수의 시작을 사용하여 8,5 MB 메모리이었다. 할당 후 9MB가되었지만 삭제 부분 이후에는 여전히 9MB였습니다. 그리고 전체 프로그램에서이 기능을 1000 번 실행합니다. 그런 다음 OS에 의해 죽게됩니다. 어떤 아이디어가 그 이유이며 어떻게 해결할 수 있습니까?

편집 : 여기에 main() 부분 : 위

int main() 
{ 
    srand(time(0)); 
    input(); 
    initialize(); 
    for(int i = 0; i < MAX_GENERATION; i++) 
    { 
     parents = selection(TS); 
     population = cross_over(parents, PC); 
     mutation(PM); 
     elite=tabu_search(population); 
     elitism(); //270 MB memory using each time. 

    } 
fclose(pFile); 
return 0; 
} 

, elitism() 함수의 첫 줄은 할당 부분, 그리고 마지막 라인은 delete 부분입니다.

+2

'delete []'는 메모리를 OS_로 되 돌리지 않습니다. –

+0

좋아, 그럼 어떻게 할 수 있니? –

+0

OS가 제공하는 제품에 따라 다릅니다. 그러나 나는 적절한 방법이 있는지 의심 스럽다. –

답변

6

제대로 당신이 new'd 같은 일 삭제해야 delete[]를 사용하려면 :

for(i=0;i<vertices;i++) 
    delete [] banned[i]; 

delete[] banned; 

귀하의 "프로세스가 사망하기는"원래 코드가 같은 포인터를 삭제 정의되지 않은 동작의 미친 금액을 발생하기 때문에 아마 여러 번 등등.

이 버전은 운영 체제에 메모리를 릴리스 할 수도 있고 출시하지 않을 수도 있습니다. 이는 컴파일러/라이브러리 및 운영 체제에서 내려진 결정입니다. 일부 시스템에서는 여전히 프로세스에 메모리가 할당 된 것처럼 보일 수 있지만 다른 프로세스에서 필요하면 OS가이를 요구할 수 있습니다.

같은 기능을 계속해서 호출하면 메모리가 누적되어서는 안됩니다. 이전 delete '블록은 new 호출에 응답 할 수 있습니다.

+0

아주 잘 작동했습니다. 감사. –

+0

안녕하세요. 이것은 Windows에서 매우 잘 작동하지만 리눅스에서는 seg를 반환합니다. 결점. 왜 그런지 알아? –

+0

게시하지 않은 코드에 버그가 있습니다. 프로그램 디버깅을 시도하십시오. 리눅스에서는 gdb와 valgrind를 사용하십시오. –

1

응용 프로그램에서 메모리를 할당하면 C++ 런타임에서 OS에 "추가 메모리"를 요청합니다. 당신이 더 많은 메모리를 다시 할당 할 것이라는 가정하에, "엄청난 양의 메모리가 해제되어 있지 않으면 그 메모리를 유지하십시오". 즉, "작업 관리자"및 기타 도구는 실제로 응용 프로그램에 할당 된 메모리의 양을 정확히 이해하는 데 이상적이지 않습니다.

그러나 실제로는 delete []은 출시 된 모든 상용 등급 컴파일러 환경에서 작동합니다.

코드에서 문제는 할당하지 않은 것을 삭제한다는 것입니다.

vertices 각각에 대해 delete []을 호출하고 new 전화와 일치하는 전체 배열에 대해 한 번 전화하십시오.

당신이 "단편화"메모리 있다는 것도 가능합니다 -이

size_t s = 100; 
for(;;) 
{ 
    int *p = new int[s]; 

    ... 
    delete [] p; 
    s += 10; 
} 
같은 예를 들어 뭔가 - [시간의 같은 수의, 같은 포인터 당신이 new이 모든 장소는 정확히 delete 같은이 있어야한다]

따라서 해제 된 메모리는 다음 할당을 위해 너무 작습니다.물론

는이 모든 혼란은

vector< vector <int> > banned(vertices); 
for(i=0;i<vertices;i++) 
    banned[i].resize(k_colors); 

를 사용하여 피할 수 그리고 지금 사용되는 메모리는 자동으로 정리됩니다.

+0

"work"는 "끝이없는 끔찍한 버그를 도입하지 않고 다른 접근 방식에 모든면에서 엄격하게 사용하지 않으면 사용할 수 없다"는 것을 의미하는 경우 그렇다.그것은 "일"에 대한 다소 이상한 정의입니다. – Puppy

+3

어, 그건 다른 점입니다. 대부분의 컨테이너 유형에 대한 기본 사항은'new'와'delete'입니다. (일반적으로 할당 자 클래스로 래핑 되기는하지만 그 위의 설탕 일뿐입니다) –

관련 문제