请考虑以下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”的内存被分配到堆栈上。所以当控制超出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