我启用了GuardMalloc来搜索我的代码中的Bug。在运行我的应用程序时,它以某种方式向我显示EXC_BAD_ACCESS
,但是当我查看变量时,不应该有EXC_BAD_ACCESS
。代码:
for(i = -radius, k = 0; i <= radius; i++){
int y = pt.y+i;
if( y <= 0 || y >= img.rows - 1)
continue;
for(j = -radius; j <= radius; j++){
int x = pt.x + j;
if(x <= 0 || x >= img.cols - 1)
continue;
float dx = (float)(img.at<sift_wt>(y, x+1) - img.at<sift_wt>(y,x-1));
float dy = (float)(img.at<sift_wt>(y-1,x) - img.at<sift_wt>(y+1,x)); //Throws EXC_BAD_ACCESS here.
X[k] = dx; Y[k] = dy; W[k] = (i*i + j*j)*expf_scale;
k++;
}
}
抛出错误时,值和变量看起来像这样:
img.rows = 255
img.cols = 255
pt.x = 220
pt.y = 244
radius = 7
i = 7
j = -7
y = 251
x = 213
k = 210
我尝试使用Guard Malloc,因为我想在另一个方法中找到另一个EXC_BAD_ACCESS
错误的来源。也许代码的这一部分是这个错误的起源,但我不知道如何解决这个问题,因为通常情况下,指针不会访问矩阵中的值(y-1 = 250
和y+1 = 252
所以仍然在Mat的边界。)
修改
变量img
是来自opencv的cv::Mat
类型的对象。所以它是一个2D矩阵,里面有关于图像的信息。
EDIT2
似乎问题是由这部分引起的:img.at<sift_wt>(y+1,x);
第一个表达式我没有得到错误。