2016-12-12 4 views
1

힙에서 생성되어 함수에서 반환 된 배열을 삭제할 수 있습니까? MEM이 누출 된 원인</p> <p>처럼 다른 곳을 사용하는 경우

Int * temp=something(5); 
// use the array.... 


delete [] temp; 

...의 당신이

int * something (int size){ 
    int * sample= new int[size]; 
    //... do something 
    return sample; 
} 

그런 다음 함수가 있다고 가정 해 봅시다 ....

하면이 거인가 ??

+2

아니요, 누출을 일으키지 않으며 완벽하게 합법적입니다. –

+3

* 수행하지 않으면 메모리 누수가 발생합니다. 'new'를 항상'delete'하고'new []'를'delete []'해야합니다. –

+2

"동적 배열"이 필요한 경우에는 동적 할당을 직접 사용하지 말고 'std :: vector'를 사용하는 것이 좋습니다. 그렇다면 이런 것들에 대해 걱정할 필요가 없습니다. –

답변

1

할당되는 배열과 할당 취소되는 배열 사이에 예외가있는 경우 메모리 누출 위험이 있으므로 이는 상당히 합리적이지만 오류가 발생하기 쉽습니다. 이 코드는 예외를 방지하기 위해 스마트 포인터를 사용하는 것이 좋습니다.

예, 할 수 있습니다 delete[] 것과 당신이 동일한 유형의 포인터 및 사용으로 new[] 에드 이전했다 한 포인터가 여전히 배열이 아직 코드의 다른 곳에서 해제되지 같은 주소에 포인트로 (소위 "이중 자유"문제). 세 가지 요구 사항을 모두 충족해야합니다. 그렇지 않으면 정의되지 않은 동작으로 실행되고 모든 베팅이 해제됩니다.

+0

아마도 RAII 기반 솔루션 (예 :'unique_ptr ','std :: vector '...)과 같은 예외적 인 대안을 제시해야합니다. – KABoissonneault