2011-04-26 2 views
0

나는 다음과 같은 코드с ++ 새로운 질문 삭제

void foo() 
{ 
    char* pcBlock = new char[1000]; 
    ... 
    delete[] pcBlock; 
    ... 
    pcBlock = new char[100000]; 
    ... 
    delete[] pcBlock; 
} 

에게 것이다 메모리 누수의 결과 아래의 코드? 첫 번째 ...하지 delete[] pcBlock을 할 경우

void foo() 
{ 
    char* pcBlock = new char[1000]; 
    ... 
    pcBlock = new char[100000]; 
    ... 
    delete[] pcBlock; 
} 
+2

std :: string 또는 std :: vector 을 사용하고 수작업 메모리 관리 및 메모리 누수에 대해 인사합니다. –

+0

@unapersson std :: vector/std :: string을 사용하지 않는 좋은 이유가 있습니다. – jv42

+0

@ jv42 무엇과 같은? –

답변

10

예, 가능성이 메모리 누수가있다. 포인터를 재 할당해도 이전에 가리킨 포인터는 자동으로 삭제되지 않습니다.

1

예, 이전에 할당 된 1000 바이트는 해제되지 않고 pcBlock은 새로운 메모리 세트로 대체됩니다. 이전 1000 바이트를 해제 할 방법이 없습니다. 그래서 mem 누출.

2

연산자 "new"와 "delete"는 쌍으로 사용해야합니다. 그렇지 않으면 "삭제"하지 않고 "새"를 사용하면 메모리 누수가 발생합니다.

1

예, 메모리가 누수 될 가능성이 큽니다 (컴파일러가 문제를 해결할만큼 똑똑하지는 않지만 대부분은 그렇지 않습니다).

어떤 식 으로든 realloc으로 시도해야 할 수도 있습니다.

0

예, 가능합니다. 아마도 배열이 겹치고 삭제 될 것이므로 첫 번째 배열은 해제되지만 실제로는 메모리의 다른 부분에 할당됩니다. 는 new의 모든 통화가 마지막에 delete의 호출로 끝나야합니다 :

0

YES IT는 메모리 누수를 C에서


을 야기 ++ 간단한 규칙이있다. 및 모든 new[] ->delete[]입니다. 그렇지 않으면 메모리 누수가 발생합니다. C++는 프로그래머가 직접 동적 메모리를 제어해야하는 언어입니다 (또는 타사 라이브러리 사용).

+0

이것은 질문에 대답하지 않습니다. – Wins

+0

@Wins ok, 대답은 YES입니다. 이제 행복하니? – PRIGORYAN

+0

내가 행복하든 안하든 상관 없습니다. StackOverflow는 묻고 답하는 것입니다. 어떤 사람이 질문을하면, 그 사람은 정말로 1) 그 사람이 그 문제를 해결하도록 돕거나, 2) 대답 뒤에있는 이유를 이해하도록 도와 주어야한다는 것을 의미합니다. 하지만 더 중요한 것은 예/아니요, 참/거짓 질문에 대한 확실한 답을 알아야합니다. – Wins

관련 문제