C++ 在函数中声明string和字符数组的一些特性

在函数中声明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恰恰是用户分配在堆上面的那种情况,这就需要用户自动释放,如果不释放,就会一直存在。但是如果你不返回地址给函数外的用户,这段空间就被遗失在茫茫内存中,找不到了,虽然它是存在的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值