2016-09-08 4 views
2

나는 for 루프를 가진 함수를 가지고 있고 루프 내부에 (그리고 입력에 따라) 어떤 변수는 malloc()을 사용하여 한 번 (처음으로) 초기화된다.정적으로 동적으로 할당 된 포인터를 free()해야합니까?

이러한 변수는 다음과 같이 선언됩니다

static double *vector;

을 한 후 나는

malloc(size*sizeof(double)); 

사용하여 메모리를 할당 질문 :

내가 이러한 변수를 해제해야합니까 호출 된 함수 안의 루프의 마지막 반복?

업데이트 : 어쩌면 내가 어떤 사람들에게는 잘못을 설명했을 수도 있습니다. 것은 호출 된 함수 (func_A)가 주 함수에서 입력에 따라 사용하는 특정 벡터에 대한 메모리를 할당합니다. 그런 다음이 func_A는 주 루프의 루프에서 여러 번 호출됩니다. 그래서 변수를 정적으로 정의하여 func_A가 호출 될 때마다 (시간 소비에 대해) 정의되지 않도록합니다. 왜냐하면 치수가 전체 실행에서 변경되지 않기 때문입니다. 변수는 정적이지만 전역 변수가 아니므로 기본 변수에서 변수를 제거 할 수는 없습니다 (맞습니까?).

+0

대답은 "다릅니다"입니다. 프로그램을 종료하기 전에 * 프로그램을 종료하기 전에 메모리를 비워야합니다. – DevSolar

+2

더 이상 필요하지 않을 때 해제해야합니다. –

+0

http://stackoverflow.com/questions/654754/what-really-happens-when-you-dont-free-after-malloc?rq=1 – jamesdlin

답변

3

항상free으로 전화를 걸어 malloc이어야합니다.

vector이 더 이상 필요하지 않다는 것을 알고있을 때 전화 할 수 있습니다.

실용적이지 않다면 언제든지 atexit으로 전화를 걸 수 있습니다. 적절한 함수 포인터를 전달하면 메모리가 free이됩니다. http://www.tutorialspoint.com/c_standard_library/c_function_atexit.htm

프로그램 종료로 인해 사용자를 대신 할 수있는 운영 체제를 사용하는 경우가 종종 있지만 그 방법을 사용하는 것은 쉽지 않습니다.

+0

선생님, 물어볼 수 있다면,'atexit()'에서'free()'또는 동등한 것을 어떤 감각으로 불러 낼 수 있습니까? 어쨌든 프로그램 종료시 메모리가 다시 확보됩니다. –

+2

좋은 반짝 운영 체제는 실제로 당신을 위해 그렇게 할 것입니다,하지만, C 표준 관점에서 일어나는 그것의 보장은 없습니다. 잘 쓰여진 소프트웨어는 항상 자체적으로 정리됩니다. – Bathsheba

+0

"당신은 항상'에 전화를 걸 수 atexit' ..."어, 항상. 이 atexit''등록 할 수 콜백의 수에 제한이, 그래서 직접 사용하는 확장 성이 좋지 않습니다. (사람이 자신의 콜백 등록 시스템을 만들고 하나의'atexit' 콜백 트리거를 가질 수 한계를 해결하려면.) – jamesdlin

0

호출 된 함수 내에서 루프의 마지막 반복에서 이러한 변수를 해제해야합니까?

당신 을 할 수 있지만 할 필요가 없습니다.

free()이어야합니다. 더 이상 필요하지 않은 메모리 할당 자 기능에 의해 할당 된 메모리. malloc()와 가족을 사용하여 메모리 할당의 주요 목적

하나는 지역 변수의 범위에 대한 제한을 극복하기 위해 당신이 free()받는 결코 그래서, (함수에서 지역 변수의 반환 주소를 불법입니다) 메모리 "호출 된 함수 내부". 호출자에게 포인터 (malloc()에 의해 반환 된)를 매우 잘 반환 할 수 있고 그 포인터 (메모리)로 다른 작업을 수행 한 다음 하위 함수의 호출자에서 포인터를 정리 (free()) 할 수 있습니다.

기억해야 할 점은 원래 malloc() 또는 패밀리가 반환 한 free()에 정확한 포인터를 전달해야한다는 것입니다.

0

데이터가 더 이상 사용되지 않을 때마다 모든 malloc 호출이 해당 무료 호출을 가져야합니다.

+0

아니, 좋은 프로그래밍 스타일이지만, 당신이해야 할 일이 아닙니다. 실제로 필요한 것은'malloc (3)'이나 이미'자유 (3)'에 의해 얻지 못했던 것에 대해'free (3)'를 호출하지 않기 위해서입니다. –

0

포인터를 놓아야합니다. 엄지 손가락으로 - malloc/new로 할당 한 모든 것이 힙에 있고 free_d/deleted가되어야합니다. 다른 모든 것은 스택에 있고

p.s.당신은 단지 자바/이동/파이썬으로 grbage 수집 된 언어를 사용하는 경우 벡터가 한 번에 할당 한 다음 prorgam의 수명 동안 사용되는 것이

0

중 하나를 알 필요가있다. 벡터는 정적 변수에 저장됩니다. 프로그램을 종료하기 전에 벡터를 해제하는 것이 좋겠지 만 해지는 또한 그렇게 할 것입니다.

프로그램의 수명 기간 동안 다른 (특히 : 더 큰) 벡터 크기로 작업 할 준비가되지 않은 것 같습니다.