我定义了我的矩阵类,我在这里放了简化版本:
// matrix of double type
typedef std::vector< std::vector< double > > dbmatrix;
class MMatrix
{
private:
// matrix with size of rowsNum times colsNum
size_t rowsNum; // number of rows
size_t colsNum; // number of columns
protected:
dbmatrix mMat; // the matrix
public:
// Constructor
MMatrix(size_t m, size_t n, double initVal);
...
// Display matrix in console (unsuitable for large matrix)
void display(void);
};
// initialize a m-by-n matrix with an initial Value
MMatrix::MMatrix(size_t m, size_t n, double initVal)
{
this->rowsNum = m;
this->colsNum = n;
this->mMat.reserve(this->rowsNum);
for (uint i = 0; i < this->rowsNum; i++)
{
dbvector oneRow(this->colsNum, initVal);
this->mMat.push_back(oneRow);
}
}
// Display matrix in console
void MMatrix::display()
{
for (uint i = 0; i < rowsNum; i++)
{
for (uint j = 0; j < colsNum; j++)
{
std::cout << mMat[i][j] << " ";
}
std::cout << std::endl;
}
std::cout << std::endl;
}
然后我生成了一个二维指针来接收函数“matrixDiff”
的结果MMatrix** divH = matrixDiff(*V, fwdKer, false);
当我在其后尝试以下代码时发生了奇怪的事情:
(*divH[0]).display();
(*divH[0]).display();
在我执行第一行之前,我的对象指针看起来很正常(图1) fig1.pointer to a 10-by-10 matrix looks normal 第一行成功地给出了想要的结果。
但是,执行第一行后,第二行(完全相同)会抛出Access违规。调试器指示执行第一行后指针丢失其目标(图2) fig2. pointer lost its target
在另外的测试中,我尝试了:
divH[0]->display();
divH[0]->display();
哪个仍然不起作用。但是,当我尝试以下代码时:
MMatrix* testMat = divH[0];
testMat->display();
testMat->display();
它完美无缺,完全让我感到困惑。
更重要的是,我还尝试在我创建的函数“matrixDiff”中显示矩阵:
MMatrix** matrixDiff(MMatrix depthMat, MMatrix ker, bool isDirect)
{
MMatrix* retMat[3];
retMat[0] = filter(depthMat, ker);
retMat[1] = filter(depthMat, (~ker));
...
retMat[0] -> display();
retMat[1] -> display();
retMat[2] = diffMag; // gradient magnitude
return retMat;
}
使用相同的两行命令,它也可以工作!
所以,我现在对c ++指针非常困惑。似乎通过对象指针传递结果会改变一些东西,虽然我原本以为它只传递了对象的地址。你能指出真正的问题在这里吗?谢谢!
答案 0 :(得分:2)
返回指向本地变量的指针。变量retMat
是本地的,一旦函数返回就会超出范围,留下一个迷路指针并使用该指针将导致未定义的行为。
我建议您使用std::array
代替:
std::array<3, MMatrix*> retMat;
在一个不相关的说明中,您应该了解通过引用而不是按值传递对象。如果depthMat
或ker
很大,您将拥有大量数据来复制您所做的每个通话。如果不修改它们,请考虑使用常量引用。