다음 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 *의 동작이 다른 이유는 무엇입니까?
"함수 이름()에"JUSTFORFUN "을 저장하기 위해 할당 된 메모리가 스택에 할당되어 있다고 생각합니다." - 그렇지 않아. – Mat
@Mat - 참조하십시오 : http://stackoverflow.com/questions/51592/is-there-a-need-to-destroy-char-string-or-char-new-char6 – Mishra
그 말은하지 않습니다. 문자열은 스택에 할당됩니다. 그렇지 않습니다. 글로벌 (읽기 전용 섹션에 저장되었을 수도 있음)입니다. – Mat