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就好了

posted @ 2017-06-27 20:43  luzhlon  阅读(112)  评论(0编辑  收藏  举报