[C++] 一个 inline 和引用引发的惨剧

By | 2016-02-25

最近遇到一个奇怪的 BUG, 细节如下:

// lib.h
extern Type &func(Type &ret, Params params);
inline Type funcT(Params params)
{
    Type ret;
    return func(ret, params);
}

// lib.cpp
Type &func(Type &ret, Params params)
{
    // do something
    return ret;
}

// caller.cpp
static Type caller(void)
{
    // do something
    return funcT(params);
}

瞄一眼似乎没啥问题, 然而残酷的事实是, caller 返回后会挂掉

对汇编什么的不熟, 还没午到可以去看汇编查 BUG, 不过猜测可能原因如下:

  1. funcT 由于 inline 被代码优化, return 的时候不会创建一个 Type 的临时对象
  2. func 返回的是参数的引用, 导致最终返回的是一个局部变量 ret 的引用
  3. caller 访问 funcT 的返回值的时候, 访问的是一个已销毁的局部变量的引用, 导致挂了

怎么解决呢? 很简单:

inline Type funcT(Params params)
{
    Type ret;
#if 0
    return func(ret, params);
#else
    func(ret, params);
    return ret;
#endif
}

总结:

C++ 果然好难啊

转载请注明来自: http://zsaber.com/blog/p/91

既然都来了, 有啥想法顺便留个言呗? (无奈小广告太多, 需审核, 见谅)

Category: C++

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注