2014-05-16 8 views
1

코드가 올바른 메모리 할당을 해제합니까?포인터에 메모리 할당하기, 다른 포인터를 동일하게 지정하고 두 번째 포인터 삭제하기

int main(){ 
int *pointerA, *pointerB; 

pointerA = new int[15](); 
for (int i=0; i<15; i++) 
    pointerA[i] = i*2; 


pointerB = pointerA; 


if (pointerA != NULL) 
     pointerA = NULL; 

// Some operation here ... 
for (int i=0; i<15; i++) 
    std::cout << i << " : " << pointerB[i] << std::endl; 

if (pointerB != NULL) 
    delete [] pointerB; 
pointerB = NULL; 


return 0; 

}

내가 pointerA를 사용하여 포인터를 생성하지만, 해제 pointerB을 사용하고 있습니다. pointerB는 pointerA와 같은 위치를 가리 킵니다.

나는 그것이 적절하게 할당 해제되어야한다고 생각하지만 확실히하고 싶습니다. 효율적으로 테스트 할 수있는 방법이 있습니까? 어쩌면 메모리 사용량을 확인하는 거대한 배열을 만드는 것일까 요 ???

감사

+0

정확하게 생각한 것처럼 동작합니다. 그러나 당신은 신경 쓰지 않아야합니다. 벡터 또는 unique_ptr 또는 shared_ptr을 사용하고 포인터에 대해 생각하지 마십시오. – stefan

+0

다른 포인터에 의해 할당 된 메모리를 삭제해도 문제가 없습니다. – augustzf

+0

전적으로 무의미한 내용으로 코드를 난독 처리하는 것을 피하기 위해 언어 기본 사항을 배우는 것이 좋습니다. 'if (pointerA == NULL) pointerA = NULL;은'pointerA = NULL;과 완전히 같습니다. 마찬가지로,'delete' 이전의'NULL' 검사는 불필요합니다,'delete'는 nullpointer로 아무 일도하지 않습니다. 특히'pointerB' * 뒤의 메모리에 접근하기 때문에'NULL'인지 묻는다. NULL이 될 가능성이있는 경우 이미 정의되지 않은 동작을 트리거했을 것입니다. – cmaster

답변

0

예, 코드 예제가 제대로 할당 된 모든 메모리 할당을 해제합니다.

당신이 pointerANULL로 설정하고 메모리가 pointerApointerB 점, 당신은 그들이 메모리에 동일한 위치를 가리키는 지 볼 것입니다 것을 주소를 비교하기 전에 줄에 중단 점을 설정한다면. 따라서 메모리의 같은 위치가 삭제 될 수 있기 때문에 어떤 변수를 사용하여 메모리를 삭제해도 상관 없습니다.

0

네, 두 번째 포인터를 사용하여 메모리를 비우는 것은 완벽합니다.

$ valgrind --log-file=/tmp/memcheck.log --tool=memcheck \ 
      --leak-check=full --show-reachable=yes --num-callers=20 ./your_tool 


$ cat /tmp/memcheck.log 

할당하지 않은 것을 삭제하려고하면 오류가 표시됩니다.

-1

대답은 "보통"입니다. 내가주의 할 두 가지가있다. "delete"를 사용하는 "new"를 사용하거나 malloc()을 사용하는 경우 free()를 사용해야합니다. 런타임 라이브러리는 "new"와 "free()"또는 "malloc()"과 "delete"를 결합하려고하면 누수가 발생할 수있는 다른 구현을 사용할 수 있습니다.

.DLL과 .EXE 또는 두 개의 .DLL로 찾을 수있는 것처럼 두 개의 별도로 링크 된 라이브러리를 다루는 경우에도 문제가 될 수 있습니다. "new"중에 메모리를 할당하는 런타임은 해당 모듈의 테이블에 메모리를 할당하지만 다른 모듈에서 삭제가 발생하면 "delete"는 동일한 메모리 할당 테이블을 가리 키지 않습니다.

일반적으로 나는 메모리의 "할당 자"가 메모리의 "할당 해제 자"와 동일한 패턴을 따르는 것이 좋습니다. 모범 사례는 RAII을 참조하십시오.