调用对象的函数后,c ++对象指针丢失

时间:2016-01-12 06:04:40

标签: c++ pointers

我定义了我的矩阵类,我在这里放了简化版本:

// 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 ++指针非常困惑。似乎通过对象指针传递结果会改变一些东西,虽然我原本以为它只传递了对象的地址。你能指出真正的问题在这里吗?谢谢!

1 个答案:

答案 0 :(得分:2)

返回指向本地变量的指针。变量retMat是本地的,一旦函数返回就会超出范围,留下一个迷路指针并使用该指针将导致未定义的行为

我建议您使用std::array代替:

std::array<3, MMatrix*> retMat;

在一个不相关的说明中,您应该了解通过引用而不是按值传递对象。如果depthMatker很大,您将拥有大量数据来复制您所做的每个通话。如果不修改它们,请考虑使用常量引用。