我正在调试一段时间,我发现有些数据成员没有按照我的预期进行初始化。我在这里放了一些图像,这样你就可以看到我是如何初始化的。
然后在调试w / breakpoints时执行一些代码后,我注意到值的变化就像它根本没有被初始化一样。
我从不在构造函数体中更改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()
来电期间会发生此错误。
答案 0 :(得分:1)
您可以在visual studio中设置数据断点,以识别对变量进行更改的代码:
转到你班级的构造函数,并在初始化后停止执行。
您必须转到断点窗口并将新数据断点(在该窗口中有一个标有New
的小按钮)添加到radius_top_left
的地址,以便您使用{{ 1}}
继续执行并等待它发生。 Visual Studio将停止更改那4个字节内存的指令。
据我所知,您最多可以设置4个数据断点,但这应该足够了。可能的原因可能是内存损坏,或者您可能有一个带有未初始化变量的对象。
答案 1 :(得分:0)
我发现了这个错误。这是由于其他data member
的内存损坏造成的。我定义了一些数组,并为它制作了一些 buggy 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
)。我没有意识到并且对此事缺乏了解。对不起,SO :(
修改强>
这应该像这样做&gt;。&lt;
border_color_top[3] = opacity;
border_color_right[3] = opacity;
border_color_bottom[3] = opacity;
border_color_left[3] = opacity;