前两天写代码的时候,大概有这样的一个需求,就是在一个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
的时候,也不会调用类的析构函数。