FUCKED-BUG之临时对象的生死
Bug出现的情形大概是这样的:
Value waitcall() {
Value iscall, v;
if (!fromMsgPack(cin, iscall))
return Value::Nil;
if (iscall)
handle();
}
int main() {
waitcall(); // 执行了这句之后就出现内存访问错误了
}
看出不妥之处了吗?
我想了好久才想到。。。
在main函数里调用waitcall时,编译器会在栈上临时分配一段空间(Temp)用来存放waitcall的返回值,这段空间会通过Value的拷贝构造函数构造;在waitcall()函数里,最后没有指定一个返回值,导致waitcall返回的Value内的数据是不确定的,因为Temp时临时存放waitcall的返回结果的,所以当调用完waitcall时,它的生命周期也就结束了,然后会被析构,但是在这里我们没有正确构造Temp,所以结果可想而知
其实我写这个函数的本意是不需要返回值的,不知道当时哪根筋不对写了这么个有残疾的函数......,把函数返回类型改为void就好了