读书人

看似是局部变量超出了作用于请前辈们

发布时间: 2013-10-27 15:21:50 作者: rapoo

貌似是局部变量超出了作用于,请前辈们帮忙看看


Matrix4f& Matrix4f::operator* (const Matrix4f& rv)
{
float mr[16] = {
(m[0]*rv[0]+m[1]*rv[4]+m[2]*rv[8]+m[3]*rv[12]),(m[0]*rv[1]+m[1]*rv[5]+m[2]*rv[9]+m[3]*rv[13]),(m[0]*rv[2]+m[1]*rv[6]+m[2]*rv[10]+m[3]*rv[14]),(m[0]*rv[3]+m[1]*rv[7]+m[2]*rv[11]+m[3]*rv[15]),
(m[4]*rv[0]+m[5]*rv[4]+m[6]*rv[8]+m[7]*rv[12]),(m[4]*rv[1]+m[5]*rv[5]+m[6]*rv[9]+m[7]*rv[13]),(m[4]*rv[2]+m[5]*rv[6]+m[6]*rv[10]+m[7]*rv[14]),(m[4]*rv[3]+m[5]*rv[7]+m[6]*rv[11]+m[7]*rv[15]),
(m[8]*rv[0]+m[9]*rv[4]+m[10]*rv[8]+m[11]*rv[12]),(m[8]*rv[1]+m[9]*rv[5]+m[10]*rv[9]+m[11]*rv[13]),(m[8]*rv[2]+m[9]*rv[6]+m[10]*rv[10]+m[11]*rv[14]),(m[8]*rv[3]+m[9]*rv[7]+m[10]*rv[11]+m[11]*rv[15]),
(m[12]*rv[0]+m[13]*rv[4]+m[14]*rv[8]+m[15]*rv[12]),(m[12]*rv[1]+m[13]*rv[5]+m[14]*rv[9]+m[15]*rv[13]),(m[12]*rv[2]+m[13]*rv[6]+m[14]*rv[10]+m[15]*rv[14]),(m[12]*rv[3]+m[13]*rv[7]+m[14]*rv[11]+m[15]*rv[15])
};

return Matrix4f(mr);
}


这是出问题的部分,程序直到执行return前,其结果都是正确的,但是在return语句中,调用该类的构造函数时,作为参数的mr在进入了构造函数以后却变为了空值
[解决办法]
返回了指向栈的引用
[解决办法]
构造函数的参数类型是啥?
[解决办法]
return Matrix4f(&mr);
[解决办法]
Matrix4f& Matrix4f::operator* (const Matrix4f& rv) {
...
return Matrix4f(mr);
}

这样使用是有问题的,返回一个临时变量的引用!!
如果返回的 Matrix4f如果立即使用于非函数操作,那么也许可以得到正确的结果,但如果跨函数使用,那结果一般都会错误

a& afun(a& b)
这种一般应该是用于
return *this 这种情况吧



[解决办法]
也就是说
Matrix4f& Matrix4f::operator* (const Matrix4f& rv) {
...
return Matrix4f(mr);
}

这样的做法是错误的
可以这样定义
Matrix4f* Matrix4f::operator* (const Matrix4f& rv) {
...
return new Matrix4f(mr);
}
调用者要负责删除指针


[解决办法]
也可以这样定义
Matrix4f Matrix4f::operator* (const Matrix4f& rv) {
...
return Matrix4f(mr);
}

就是不能像你那样定义

[解决办法]
Matrix4f& Matrix4f::operator* (const Matrix4f& rv) {
...
return Matrix4f(mr);
}

这种做饭返回的数据存在于函数体的栈空间中,函数返回后,其空间就会不受控,随时都会被覆盖!

读书人网 >C++

热点推荐