C++临时对象

C++中的临时对象是未命名的non-heap对象,常见于隐式类型转换、函数返回对象和无名对象创建。这些匿名对象在表达式结束后可能立即析构,可能导致安全问题。例如,s1+s2会产生临时对象,该对象在表达式结束时会被析构,影响后续使用。临时对象的生命周期管理是C++中复杂且需要注意的问题。
摘要由CSDN通过智能技术生成

C++真正所谓的临时对象是不可见的——不会在你的源代码中出现。只要你产生一个non-heap object而没有为它命名,便诞生了一个临时对象。此等匿名对象通常发生于两种情况:

一是当隐式类型转换(implicit type conversions)被施行起来以求函数调用能够成功;

二是当函数返回对象的时候;

其实还有一种情况就是当你建立一个non-heap object对象,也就是无名对象的时候。

这里举一个常见的容易忽视的错误:

#include <iostream>

using namespace std;

int main(int argc, char *argv[]) {
    string s1("a"),s2("b");
    const char * s = (s1+s2).c_str();
    printf("%s\n",s);
}

这个程序运行的时候你可能会得到正确的结果,但事实上这里的做法是不安全的,s1+s2产生的临时对象会在表达式的结尾被析构,所以如果跟踪堆栈会发现在print语句中s的内存空间已经指向未知地址了。

这里针对3种会产生临时对象的情况举例进行说明:

1.隐式类型转换

void uppercasify(string& str);

// changes all chars in str to upper case
char subtleBookPlug[] = "Effective C++";
uppercasify(subtleBookPlug); //error!!!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值