아래의 코드로 인해 메모리 누수가 발생할 수 있습니다.이 코드는 메모리 누출을 방지합니까?
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;
아래의 코드로 인해 메모리 누수가 발생할 수 있습니다.이 코드는 메모리 누출을 방지합니까?
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;
괜찮습니다. 두 개의 할당과 두 개의 할당 해제, 일치하는 유형 및 대응 포인터가 있습니다. 기억이 누출되지 않습니다.
코드가 완료되면 메모리 누수가 없습니다. 예외가 발생하면 누출됩니다.
만약 누출된다면 행'a [0] = new char [m * n];'이 throw됩니다. 메모리가 할당 된 후에 실행되는 다른 모든 명령문은 no-throw입니다. –
VS2010에서 실행 해 보았습니다. – RayZy
두 번째 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
는 가장 좋은 것입니다.
벡터 컨테이너는 우리에게 큰 편의를 제공합니다, 나는 동의하지만, 효율성의 비용은 그렇지 않습니까? – RayZy
최적화가 비활성화되어 있지 않거나 구현이 매우 나쁜 경우가 아니라면 수동 관리 배열과 마찬가지로 효율적이어야합니다. 내 코드는 두 개의 메모리 할당,'m' 할당 및 두 개의 할당 해제와 같이 거의 동일하게 동작해야하며 모든 함수 호출은 인라인되어야합니다. 예외 관리 방법에 따라 예외 안전 비용이있을 수 있지만 누출 문제를 해결하려고했지만 비용이 발생합니다. –
할당에 실패하지 않고 예외가 발생하지 않는 한. 당신이 정말로 필요하지 않는 한 수동 할당을 사용하지 마십시오. –
OOM 상황에 신경 쓰면 새 던지기가 맞습니다. 나는 던지지 않는 임베디드 allocators에 익숙하다. 그냥 상자를 열심히 리셋한다. :-) – user9876
사실, 꽤 못생긴 코드 다.하지만 나는 단지이 한개의 복용량을 확인하고 싶다. – RayZy