2011-08-05 4 views
0

아래의 코드로 인해 메모리 누수가 발생할 수 있습니다.이 코드는 메모리 누출을 방지합니까?

char **a; 
a = new char* [m]; 
a[0] = new char[m * n]; // allocate all need 
for(int i=1; i<m; i++) 
{ 
a[i] = a[i-1] + n;//allocate every pointer 
} 
delete[] a[0]; 
delete[] a; 

답변

3

괜찮습니다. 두 개의 할당과 두 개의 할당 해제, 일치하는 유형 및 대응 포인터가 있습니다. 기억이 누출되지 않습니다.

+2

할당에 실패하지 않고 예외가 발생하지 않는 한. 당신이 정말로 필요하지 않는 한 수동 할당을 사용하지 마십시오. –

+0

OOM 상황에 신경 쓰면 새 던지기가 맞습니다. 나는 던지지 않는 임베디드 allocators에 익숙하다. 그냥 상자를 열심히 리셋한다. :-) – user9876

+0

사실, 꽤 못생긴 코드 다.하지만 나는 단지이 한개의 복용량을 확인하고 싶다. – RayZy

4

코드가 완료되면 메모리 누수가 없습니다. 예외가 발생하면 누출됩니다.

+0

만약 누출된다면 행'a [0] = new char [m * n];'이 throw됩니다. 메모리가 할당 된 후에 실행되는 다른 모든 명령문은 no-throw입니다. –

+0

VS2010에서 실행 해 보았습니다. – RayZy

1

두 번째 new이 실패하면 예외가 발생하고 첫 번째 할당은 삭제되지 않으므로 누출이 발생합니다.

이 문제를 방지하는 가장 좋은 방법은 수동으로 메모리를 관리하는 대신 리소스 관리 클래스를 사용하는 것입니다. 코드가 정상적으로 완료하거나 예외를 발생 여부를

std::vector<char> memory(m * n); 
std::vector<char*> pointers; 

pointers.reserve(m); 
pointers.push_back(&memory.front()); 
for (int i = 1; i < m; ++i) { 
    pointers.push_back(pointers.back() + n); 
} 

이제, 소멸자가 보장

호출 할, 그래서 어떤 경우에는 누수가 없을 것입니다 :이 경우, std::vector는 가장 좋은 것입니다.

+0

벡터 컨테이너는 우리에게 큰 편의를 제공합니다, 나는 동의하지만, 효율성의 비용은 그렇지 않습니까? – RayZy

+0

최적화가 비활성화되어 있지 않거나 구현이 매우 나쁜 경우가 아니라면 수동 관리 배열과 마찬가지로 효율적이어야합니다. 내 코드는 두 개의 메모리 할당,'m' 할당 및 두 개의 할당 해제와 같이 거의 동일하게 동작해야하며 모든 함수 호출은 인라인되어야합니다. 예외 관리 방법에 따라 예외 안전 비용이있을 수 있지만 누출 문제를 해결하려고했지만 비용이 발생합니다. –

관련 문제