最近遇到一个奇怪的 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, 不过猜测可能原因如下:
- funcT 由于 inline 被代码优化, return 的时候不会创建一个 Type 的临时对象
- func 返回的是参数的引用, 导致最终返回的是一个局部变量 ret 的引用
- 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
既然都来了, 有啥想法顺便留个言呗? (无奈小广告太多, 需审核, 见谅)