2016-12-06 5 views
0

의는이 코드가 있다고 가정하자 다른 곳에서는 사용하고 각 for주기는 서로 독립적입니다하지에 할당 된 포인터 : 해제해야합니까?

for (int i=0;i<n;i++) { 
    //compute z 
    float *p = (float *) malloc (sizeof(float)*z); 
    //do something with p 
} 

공지 사항 p있다.

는 이제 z 너무 큰 아니라고 가정하자, 그래서 단일 p는 memmory의 측면에서 비싼 없습니다. 그러나 n은 잠재적으로 크므로 p이 차지하는 전체 메모리가 일정 할 수 있습니다.

인가 그것은 올바른와 free()을에 :

for (int i=0;i<n;i++) { 
    //compute z 
    float *p = (float *) malloc (sizeof(float)*z); 
    //do something with p 
    free(p); 
} 

보너스 질문 : 시간 성능이 우선 순위 (그리고 메모리 소비)가 소요되는 시간 이후의 free(p)을 피하기 위해 더 나을 것 경우 ?

+3

왜 C++ 태그가 여기 있습니까? –

+0

@EdgarRokyan 네 말이 맞아. – justHelloWorld

답변

4

(이 큰 프로젝트에 특히 중요하다), 당신은 mallocfree를 사용해서는 안됩니다. smart pointers(또는 C++ 11 호환 컴파일러에 액세스 할 수없는 경우 new/delete)을 사용하십시오.


for (int i=0;i<n;i++) { // compute z std::unique_ptr<float[]> p{new float[z]}; // do something with p // p gets automatically freed at the end of the scope } 

귀하의 질문에 대답하려면 :

그것이 올바른 확보하는 것입니다()을 함께 ...

예. malloc으로 할당하면 항상 free이 필요합니다.

시간이 많이 소요되므로 무료 (p)를 피하는 것이 좋습니다.

예. 루프 외부에서 메모리 위치를 미리 할당하는 것을 고려하십시오.

// preallocate 
std::unique_ptr<float[]> p{new float[z]}; 

for (int i=0;i<n;i++) { 
    // clear p 
    // compute z 
    // do something with p 
} 

// p gets automatically freed at the end of the scope 
+0

답변 해 주셔서 감사합니다. 난 스마트 포인터를 사용한 적이 있지만 내 질문은 :'v.push_back (p)''std :: vector > '을 사용하고''v' '루프? 어쨌든'p'는 자동으로 스코프 끝에서 해제됩니까? – justHelloWorld

+0

'std :: vector >'을 사용한다면, 힙 할당 배열의 크기 조정이 가능한 힙 배열을 정의 할 수 있습니다. 아마'std :: vector '을 대신 쓰고 싶을 것이다. 얼마 전에 [스마트 포인터에 대한 비디오 자습서] (https://www.youtube.com/watch?v=zMdD-s5_BIY)를 만들었습니다. 비디오를 통해 배우는 것을 즐긴다면 시작하는 것이 좋은 장소라고 생각합니다. –

3

주기 전에 필요한 메모리 양을 미리 할당하고 다시 사용할 수 있습니다. 또, 다음 재 할당 - - 경우

당신이 z는 것이 얼마나 큰 모르는 경우 - 어디 선가 할당 된 메모리의 크기를 작성하는 것이 좋습니다, 그리고 z이보다 큰 경우 바로 재사용이 이미 할당 기억.

+0

답변 해 주셔서 감사합니다. 'z'는 매우 가변적인데, 수 백개가 될 수 있습니다 (그것은 입력 이미지에 완전히 의존하는 SIFT 알고리즘에 의해 검출 된 키포인트의 수입니다). – justHelloWorld

+0

그런 다음 Z가 메모리가 이미 할당 된 이전의 하이 Z보다 많으면 다시 할당하십시오. – Starl1ght

0

예. free이 필요합니다. 그렇지 않으면 메모리 누수가 발생합니다. 특히 많은 횟수 반복 할 경우.

malloc은 모두 free과 일치해야합니다. 항상. 당신이 C++에이 태그 때문에

2

관찰 : malloc이 사용됩니다. 법 : free을 호출하십시오.그것만큼이나 간단합니다. 이동식의 잘 정의 된 코드는 mallocfree이 필요합니다.

할당 된 메모리 양은 여기에서 아무런 역할을하지 않습니다. 너무 많은 메모리 인 경우 malloc은 오류를 던질 것이지만, 이는 을 따르기 위해 항상 free이 필요하다는 사실과 아무런 관련이 없습니다.

+0

답변 해 주셔서 감사합니다. 그러나 고성능 응용 프로그램에 대해 말하면 '자유'는 시간이 많이 걸릴 수 있으므로 메모리가 비효율적 일지라도 시간면에서 더 효율적일 수 있습니다. – justHelloWorld

+1

@justHelloWorld 정확성을 희생시키면서 효율성을 위해 노력하지 마십시오. 성능이 중요한 경우 메모리를 미리 할당하고 다시 사용하십시오 (http://stackoverflow.com/a/40992293/3494013). 모든 경우에,'malloc' 후에'free'를 호출하십시오. 그리고 메모리 양이 [ "매우 가변적"인 경우 (http://stackoverflow.com/questions/40992251/pointer-allocated-in-for-should-i-have-to-free-it/40992321#comment69193323_40992293) 당신이 말했듯이, 달리 할 수있는 영리한 방법을 내놓으십시오. 패턴을 찾아 내고 비열한 방법을 생각해보십시오. 그러나 '자유로운'선생님을 잊지 마십시오. – Downvoter

+1

로저 선생님, 나는 그를 잊지 않을 것입니다 : D – justHelloWorld

0

불필요한 할당을 피하기 위해 다시 사용되는 버퍼 사용을 고려하십시오. 이 std::vector<float>를 사용하여 매우 쉽게 수행 할 수 있습니다 : 최악의 경우

std::vector<float> p; 
for (int i=0;i<n;i++) { 
    //compute z 
    p.resize(z); 
    //do something with p 
} 

당신은 O(log n) 메모리 할당을 얻는다. 코드를 사용하면 n 개의 메모리 할당을 얻게됩니다. free()을 호출하지 않으면 메모리 누수가 발생합니다. std::vector<float>은 결국 자동으로 메모리를 정리합니다.

0

크기가 일정한 것 같습니다. 왜 반복해서 할당하고 싶습니까? 루프 내에서 한 번만 할당하십시오. 처음에는 루프 내부에서 초기화됩니다. 메모리를 다시 사용할 수 있습니다. 그리고 루프가 끝나면 메모리가 해제됩니다.

그리고 루프가 끝난 후 프로그램이 끝나면 프로그램을 사용하지 않은 모든 힙 메모리가 OS로 반환되지만 항상 할당 한 메모리를 확보하는 것이 좋습니다. 보너스 질문에서 무료는 시간이 많이 걸리지 않지만 메모리를 할당하는 것이므로 무료로 소요되는 시간에 대해서는 걱정하지 마십시오.

0

메모리를 다시 사용하면 프로그램을 끝내고 한 번만 할당하면 더 효율적입니다 (더 크고 작은 배열이 필요할 때 realloc()을 사용하여 다시 할당하십시오).

프로그램 할 때마다 OS가 프로그램을 종료 할 때 동적으로 할당 된 메모리를 해제하도록 처리합니다. 그러나 우리가 주로 크로스 플랫폼으로 코드를 유지하려고 시도 할 때마다 항상 free() 동적으로 메모리를 할당해야합니다.

엄청난 양의 메모리가 있고 속도 만 신경 쓰면 - 분명히 free() ing은 프로그램 속도를 떨어 뜨릴 것입니다. 그러나 걸리는 시간은 너무 작습니다. 겸손한 기계에 76*(10**-8), 1024 바이트 덩어리에 대해, 그것은 상당히 중요하지 않습니다.