2013-06-23 2 views
-2

다음 C++ 코드 조각을 고려하십시오. char *에 대한 참조를 함수의 매개 변수로 전달하고 있습니다.C++ 스택 메모리가 해제되지 않음

void name(char **str){ 
    *str=(char *)"JUSTFORFUN"; 
} 


int main(int argc, const char * argv[]) 
{ 
    char *test; 
    name(&test); 
    cout<<test; //Prints "JUSTFORFUN" 
    //delete(test); //Throws error "pointer being freed was not allocated" 
    return 0; 
} 

"JUSTFORFUN"을 function name()에 저장하기 위해 할당 된 메모리가 스택에 할당되어 있다고 생각합니다. 따라서 컨트롤이 name()에서 벗어나면 (char *) "JUSTFORFUN"과 연관된 메모리가 컴파일러에 의해 해제되어야합니다. 내 질문은 왜 내가 여전히 테스트를 인쇄 할 때 올바른 출력을 얻을 수 있습니까? 쓰레기 값을 출력해서는 안됩니까?

내가 int와 비슷한 것을 할 때. 나는 예상 한 결과를 얻는다.

void nameint(int **value){ 
    int val=5; 
    *value=&val; 
} 

int main(int argc, const char * argv[]) 
{ 
    int *val; 
    nameint(&val); 
    cout<<*val; //Prints a junk value 1073828160  
    return 0; 
} 

int와 char *의 동작이 다른 이유는 무엇입니까?

+1

"함수 이름()에"JUSTFORFUN "을 저장하기 위해 할당 된 메모리가 스택에 할당되어 있다고 생각합니다." - 그렇지 않아. – Mat

+0

@Mat - 참조하십시오 : http://stackoverflow.com/questions/51592/is-there-a-need-to-destroy-char-string-or-char-new-char6 – Mishra

+1

그 말은하지 않습니다. 문자열은 스택에 할당됩니다. 그렇지 않습니다. 글로벌 (읽기 전용 섹션에 저장되었을 수도 있음)입니다. – Mat

답변

1

문자열 리터럴 "JUSTFORFUN"이 아니며 스택에 저장된입니다. 정적 저장 기간이 있습니다. 함수 name에만 나타나기는하지만 문자열 리터럴 자체는 이 아니며 해당 함수에 로컬 인입니다 (문자열 리터럴은 없습니다 - 모두 정적 저장 기간을가집니다).

이와 같이 첫 번째 프로그램의 동작은 실제로 잘 정의되어 있습니다. name이 반환 된 후 val에는 정적 저장 기간이있는 문자열 리터럴의 주소가 포함되어 인쇄됩니다.

두 번째 프로그램에서는 함수에 로컬 인 int 주소를 반환합니다. 함수가 반환 된 후에는 그 int이 더 이상 존재하지 않으므로이를 사용하면 정의되지 않은 동작이 발생합니다. 일반적인 경우에는 해당 주소의 현재 비트가 작동하는 값을 인쇄하지만 아마 무엇을 보장 할 수는 없습니다. 해야 할 것.

1

"JUSTFORFUN"은 스택에 할당되지 않습니다. 나머지 프로그램의 정적 데이터와 함께 저장됩니다. name 함수는 포인터를 스택에 포인터로 저장합니다. 포인터가 정적 데이터를 가리키고 있습니다.

귀하의 int, 그러나, 은 스택에 저장되어입니다. nameint 함수는 스택의 해당 위치에 대한 포인터를 반환합니다. 이와 같이하면 프로그램이 매우 빨리 중단 될 수 있습니다.

0

두 개의 서로 다른 경우 : 정적 불변의 데이터로 그것에 대해 생각할 수 있도록 const char* x = "sdfsdf" 같은 원시 문자열이 실행 파일의 데이터 섹션에 저장되기 때문에

문자열 경우

, 당신이 어떤 메모리를 할당하지 않았다 (메모리 할당 할당이 전혀 없습니다!)

두 번째 경우에 val이 함수 스택에 할당되고 함수가 반환 될 때 무효화됩니다.

0

내가 함수 이름에 "JUSTFORFUN"를 저장하기 위해 할당 된 메모리() 스택

없음에 할당 된 생각, 그것을하지 않습니다. 문자열 리터럴은 암시 적으로 저장 기간이 static입니다. 그들의 일생은 프로그램의 일생입니다. delete이 없으면 첫 번째 프로그램이 올바른 것입니다.

new을 사용하여 해당 객체를 생성하지 않았기 때문에 오류가 않습니다 물론

"포인터가 할당되지 않은 해제되고"슬로우합니다.

intchar *의 동작이 다른 이유는 무엇입니까?

이것이 언어 정의 방법입니다. 두 번째 프로그램에서 int이 자동 저장 기간 (단어가 "스택 할당 됨")을 가지므로 해당 범위를 벗어나는 주소 (여기의 함수)를 사용하면 정의되지 않은 동작이 호출됩니다.

관련 문제