给定的参数值在 C++ 中的函数 body 中被更改

given argument values are changed in the function body in C++

我有以下header和函数定义;

blautil.hpp

namespace blautil{
    ...
    cv::Mat compute_mean_mat(std::vector<cv::Mat> data, const int w, const int h);
    ...
}

blautil.cpp

namespace blautil{
...
    cv::Mat compute_mean_mat(std::vector<cv::Mat> data, const int w, const int h){
        cv::Mat Mean = cv::Mat::zeros(w, h, CV_32F);
        for (int i = 1; i <= data.size(); i++){
            cv::Mat image = data[i];
            Mean += image;
        }
        Mean = Mean / data.size();
        Mean.convertTo(Mean, CV_8U);
        return Mean;
    }
...
}

我在这里这样称呼它;

cv::Mat mean_img = blautils::compute_mean_mat(imageVector, width, height);

问题是在运行时这些宽度和高度值分别是 25 和 45 但是当代码进入函数时 body 它们会变成不同的随机大值。

我在 VS2013 Win8 上编码。从这些观察中,您会提出什么建议来诊断那个有趣的问题?

编辑: 一旦我在一次编译前后为 w 和 h 定义了默认值,我就删除了。之后就出现了这个问题。同样的问题也出现在另一个函数上,我通过改变函数参数的顺序解决了它,但现在它还不能正常工作

当参数被覆盖时,这可能意味着您正在覆盖堆栈的边界。我不知道它是否会导致实际问题,但您正在尝试访问无效的数据元素,因为我可以成为 data.size()。循环应该是

for (int i = 1; i <= data.size(); i++){
...
}

要具体分析这个问题,printf 或 cout i 的值连同 w 和 h 的值,你应该能看出哪里出了问题。

我马上看到的一个错误是:

for (int i = 1; i <= data.size(); i++)
                  ^^
{
    cv::Mat image = data[i];
    Mean += image;
}

应该是:

for (int i = 1; i < data.size(); i++)

更安全,不会越界:

#include <algorithm>
//...
std::for_each(data.begin(), data.end(), [&](cv::Mat& m){Mean += m;});