2014-03-24 3 views
1

윌이 누출 메모리 :C++ 메모리 누수가 확인

std::string GetStringFromUser(std::string sPrompt, int nMaxBuffSize) 
{ 
    int i, ch; 
    char *psBuffer = (char *) _alloca(nMaxBuffSize); 
    fprintf(stderr, "%s", sPrompt.c_str()); 
    fflush(stderr); 
    for (i = 0; (i < nMaxBuffSize) && ((ch = getchar()) != EOF) && (ch != '\n'); i++) 
    { 
     psBuffer[i] = (char) ch; 
    } 
    psBuffer[i] = '\0'; 
    return (std::string) psBuffer; 

} // GetStringFromUser() 

내 낫다고 중 하나에 의해 작성된하지만 psBuffer은 절대로 삭제되지 것처럼 보인다.

+4

왜 모호한 몸입니까? 왜 그냥'std :: string line; std :: getline (std :: cin, line); 반환 선;'? 분명히 메모리 누수가 없습니다. – chris

+0

사이드 노트에서, 사용자에게'stderr'를 촉구하는 것이 이상하게 보입니다. – user2802841

+0

나는 그것을 좋아한다, 그것은 캡슐에 넣어졌다. 그러나 당신의 더 나은 자 중의 한 명이 마이크로 최적화를하는 것에 사로 잡혀있는 것으로 보입니다. 'std :: getline'을 사용하여 다른 메소드에 대한 프로파일 링을 한 적이 있다면 결과를 알려줍니다. – Claudiordgz

답변

2

아니요,이 함수에는 메모리 누수가 없으며 alloca를 사용하면 스택에 할당 된 메모리 누수가 발생하지 않습니다. http://www.gnu.org/software/libc/manual/html_mono/libc.html#Variable-Size-Automatic에서 : 가변 크기

3.2.5 자동 저장 함수 alloca는 동적으로 할당을하지만 자동적 해제되는 불충분 한 동적 할당을 지원합니다.

alloca를 사용하여 블록을 할당하는 것은 명시적인 작업입니다. 원하는만큼의 블록을 할당하고 런타임에 크기를 계산할 수 있습니다. 그러나 alloca가 호출 된 함수를 빠져 나올 때 마치 모든 함수가 선언 된 자동 변수 인 것처럼 모든 블록이 해제됩니다. 공간을 명시 적으로 해제 할 수있는 방법은 없습니다.

-2

네, 누출됩니다. 삭제하려면 free(psBuffer)으로 전화해야합니다. 자동 가비지 수집되지 않습니다.

또한 (std::string) psBuffer도 작동 할 것입니다. STL 문자열 및 C 스타일 문자열은 두 개의 다른 컨테이너 유형입니다. STL 문자열은 내부 컨테이너로 C 스타일 문자열을 사용하며 더 많은 정보를 포함합니다. 따라서 C 스타일 유형 변환은 작동하지 않습니다.

대신, 당신은 원래 return 문을 교체하려면 다음을 수행해야합니다

std::string ret(psBuffer); // <-- content of psBuffer will be copied into string ret. 
free(psBuffer);   // <-- garbage collect. 
return ret;    // <-- return the correct string. 
+0

'_alloca '에 의해 할당 된 메모리는 자동으로 해제됩니다 (스택 상에 있습니다). 그리고'(std :: string) psBuffer'는'const char *'생성자를 호출합니다. 허락하신다면, 나는'std :: string (psBuffer)'를 훨씬 좋아합니다. – chris

+0

nope. '_alloca'는 자동 저장 장치입니다. – KitsuneYMG

+0

'_alloca'는'malloc'의 백본입니다. 자동으로 저장소를 제공하지만 가비지 수집이 없습니다. C 또는 C++에서 가비지 콜렉션이 없습니다. 오버로드 된'_alloc'을 사용하지 않는 한 그렇지 않습니다. – Xephon

1

그것은 추한지만 괜찮아 (I는 _alloca은 본질적으로 alloca입니다 있으리라 믿고있어).

alloca의 가능한 문제에 대한 설명은 this question을 참조하십시오.