나는 루프 내에서 다음 줄이있는 경우 :C++ 포인터 간단한 질문
Type *unite = new Type(newSize);
아니면 내부 연산자를 삭제하지 않은 경우 메모리에 어떤 문제의 행동이 무엇인지
double *array= new double[anySize];
그것? 그것은 서로 다른 메모리 위치에 객체와 배열을 지속적으로 할당 할 것이므로 메모리 누수가 발생합니까?
나는 루프 내에서 다음 줄이있는 경우 :C++ 포인터 간단한 질문
Type *unite = new Type(newSize);
아니면 내부 연산자를 삭제하지 않은 경우 메모리에 어떤 문제의 행동이 무엇인지
double *array= new double[anySize];
그것? 그것은 서로 다른 메모리 위치에 객체와 배열을 지속적으로 할당 할 것이므로 메모리 누수가 발생합니까?
예.
for (int i = 0; i < 10; ++i)
{
Type* unite = new Type(newSize);
}
은 모두 다른 위치에 Type
유형의 개체 10 개를 할당합니다. 그들 중 어느 것도 할당 해제되지 않을 것이고 결국에는 그들 중 하나에 대한 포인터가 없을 것입니다. 10 * sizeof(Type)
바이트의 메모리가 누출됩니다. 마찬가지로
for (int i = 0; i < 10; ++i)
{
double *array= new double[anySize];
}
뜻 메모리 10 * anySize * sizeof(double)
바이트 누출.
다른 메모리 위치에 끊임없이 개체와 배열을 할당하므로 메모리 누수가 발생합니까?
for (;x;x) { double *ptr = new double[42]; }
는 그 다음 대답은 '예, 메모리가 유출되어
가정이를 의미한다.
예. 루프를 반복 할 때마다 메모리가 누출됩니다. boost::scoped_ptr
및 boost::scoped_array
이 이러한 상황을 처리하도록 만들어졌습니다.
작은 세부 사항이지만 '10 * anySize * sizeof (double) + c'와 같이 배열 할당을위한 일정한 공간 오버 헤드가 없어야합니까? –
배열의 크기 정보를 저장하기 위해 구현을 과도하게 할당 할 필요는 없습니다. 예를 들어 배열 크기 데이터가 할당의 유무에 관계없이 존재할 수있는 테이블에 저장 될 수 있습니다. 그래서 여러분이 흘린 오버 헤드가 누출 될 것이라는 것은 맞지만, 얼마나 많은 양 (심지어 + + c라고 말하는 일반적인 것조차도)은 오버 헤드가 할당과 함께 'O (n)'증가한다는 것을 의미하기 때문에 불가능합니다. 이것은 반드시 모든 구현에 적용되는 방식으로 이루어져야합니다. –