focus on linux, c/c++, lua

糊涂的午后:返回临时对象

前两天写代码的时候,大概有这样的一个需求,就是在一个hash_map中查找一个对象,有的就返回,没有的话就返回空对象。恰好这个对象是std::vector。
我今天看了下代码,居然代码是这样写的
VECTOR& GetElement(TYPE key)
{
     VECTOR vecTmp;
     if (find)
     {
           vecTmp = value;
     }
     return vecTmp;
}

大概的意思就是找到这个值就返回它的value,一个长度不为0的vector,如果找不到,就返回一个空的vector。很明显这样做,始终是返回一个空的vector。
因为vecTmp是一个临时对象,它退出生命空间的时候,会被析构,然后把析构过的对象再传给一个临时对象,也就是你的值。尽管在传值的时候,程序不会
崩溃,尽管栈已经回收,但是vecTmp还是把它的内容传给了一个临时的对象。
正确的做法应该是在参数中做左值传递。
void GetElement(TYPE key, VECTOR& vec);

哎,太热了,这样的错误都能犯,服了你了!
2010-1008添加:
关于在容器中保存实例还是指针的问题,保存实例,在push_back的时候因为是值传递,会产生临时对象,那么就会多一次临时对象的创建和析构,且在vector
调用clear的时候,要调用每个实例的析构函数。如果保存指针,那也就是4个字节的int变量,不存在临时变量,构造函数,析构函数等等问题,而且即使在clear
的时候,也不会调用类的析构函数。

posted on 2010-07-03 16:19 zuhd 阅读(396) 评论(0)  编辑 收藏 引用 所属分类: c/c++


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理