Пожалуйста, рассмотрите следующий фрагмент кода 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» в имени функции() выделяется в стеке. Поэтому, когда элемент управления выходит из имени(), память, связанная с (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