初始化数据成员时出错

时间:2013-11-12 09:54:31

标签: c++ initialization

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

a

然后在调试w / breakpoints时执行一些代码后,我注意到值的变化就像它根本没有被初始化一样。

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()来电期间会发生此错误。

2 个答案:

答案 0 :(得分:1)

您可以在visual studio中设置数据断点,以识别对变量进行更改的代码:

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

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

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

  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;