【发布时间】:2013-06-23 05:42:34
【问题描述】:
请考虑以下 C++ 代码片段。我将 char * 的引用作为函数的参数传递。
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;
}
我认为分配用于在函数 name() 中存储“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 * 的行为有区别?
【问题讨论】:
-
“我认为在函数 name() 中分配用于存储“JUSTFORFUN”的内存是在堆栈上分配的。” - 不是。
-
@Mat - 请参考:stackoverflow.com/questions/51592/…
-
这并没有说字符串在堆栈上分配的任何地方。不是,它是一个全局的(可能存储在只读部分)。
-
@zmbq 我的直接猜测是 1. 受骗,2. 缺乏研究工作。
标签: c++ c pointers memory-management