在函数中声明string
char * test(void )
{
string test;
test = "yinjianwen";
return (char *)test.c_str();
}
int main()
{
enum tesT {a,b=5,c,};
printf("a = %d\n", a);
char *p;
p = test();
printf("%s\n", p);
p[2] = '*';
printf("%s\n", p);
test();
printf("%s\n", p);
}
以上面这串代码为例,我们可以得到如下结果:
a = 0
yinjianwen
yi*jianwen
yinjianwen
说明,在函数中申请的string变量的生命周期是超出了函数外的,而且这个地址空间是被重复使用的。
如果强行delete是可以清空的,但是会在运行的时候报错,这应该是不保险的。
不要想free了,free是用来对付指针指引的地址空间的。
如果把string替换为char []
这样就回到C语言中的情况,一但退出函数,这个地址是被回收了的,里面的内容被修改成什么样是不可控制的。
如果是malloc分配的空间呢?
经验证,用户分配的空间是在堆上面的,而函数能够自动释放的空间是计算机自动分配在栈上面的内容。malloc恰恰是用户分配在堆上面的那种情况,这就需要用户自动释放,如果不释放,就会一直存在。但是如果你不返回地址给函数外的用户,这段空间就被遗失在茫茫内存中,找不到了,虽然它是存在的。