0

しばらくデバッグしていると、一部のデータ メンバーが期待どおりに初期化されていないことがわかりました。ここにいくつかの画像を置いたので、どのように初期化したかがわかります。

a

次に、ブレークポイントを使用してデバッグ中にいくつかのコードを実行した後、まったく初期化されていないかのように値が変化することに気付きました。

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

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]が配列の境界を超えると、他のメモリ アドレスが上書きされます (範囲は のみである必要があります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 に答える