0

我正在调试一段时间,我发现一些数据成员没有像我预期的那样初始化。我在这里放了一些图片,这样你就可以看到我是如何初始化它的。

一个

然后在调试带断点的同时执行一些代码后,我注意到值发生了变化,就好像它根本没有被初始化一样。

b

我从不改变那些data members只在构造函数体内的值。我什至尝试这样做。

rect.radius_top_right = 1;
rect.radius_top_left = 1;
rect.radius_bottom_right = 1;
rect.radius_bottom_left = 1;

值在这一点上发生了变化,但是当它到达需要它的函数时,它又回到了它的垃圾值。

你能指出这里有什么问题吗?

编辑:

class swcRectangle我像这样在全局范围(外部main函数)中实例化。

swcRectangle rect;

此错误发生在swcRectangle::draw()通话期间。

4

2 回答 2

1

您可以在 Visual Studio 中设置数据断点,以识别正在更改您的变量的代码:

  1. 转到您的类的构造函数,并在初始化后停止执行。

  2. 在那里,您必须转到断点窗口并将新的数据断点(New该窗口中标记有一个小按钮)添加到地址,radius_top_left以便您使用&radius_top_left

  3. 继续执行并等待它发生。Visual Studio 将在更改这 4 个字节内存的指令处停止。

据我所知,您最多可以设置 4 个数据断点,但这应该足够了。可能的原因可能是内存损坏,或者您可能有一个带有未初始化变量的对象。

于 2013-11-12T10:00:50.477 回答
0

我发现了这个错误。这是由于其他的内存损坏data member。我定义了一些数组,并为它做了一些错误的 setter 方法。

typedef unsigned char uchar;
typedef uchar rgba[4];

uchar color[4 * 4];
rgba border_color_top;
rgba border_color_right;
rgba border_color_bottom;
rgba border_color_left;

void swcRectangle::setOpacity(uchar opacity)
{
    this->opacity = opacity;
    for (int i = 3; i < 3 * 4; i +=4)
    {
        this->color[i] = opacity;
        //I should have use another iterator here, not 'i'
        border_color_top[i] = opacity;
        border_color_right[i] = opacity;
        border_color_bottom[i] = opacity;
        border_color_left[i] = opacity;
    }
}

不包括 的索引this->color[n]超出数组的边界 w/c 会导致覆盖其他内存地址(它应该仅在 范围内0 - 4)。我对这件事一无所知,也缺乏了解。对不起,所以:(

编辑:

这应该是这样完成的>.<

border_color_top[3] = opacity;
border_color_right[3] = opacity;
border_color_bottom[3] = opacity;
border_color_left[3] = opacity;
于 2013-11-12T11:21:46.883 回答