0

プログラムを実行して新しいNetworkEditorを実行すると、配列のメモリから読み取られるため、コンストラクターで破損します。
1ループずつデバッグすると大丈夫です!?
なんで?コンストラクターに入る前に、配列に十分なメモリーを割り当てていませんか?

私のクラスには、2つのプロパティがあります。

/*NetworkEditor.h*/

    class CNetworkEditor : public CDiagramEditor
    {...
        VLLink* VL_list[10];
        VLLink* temp_VL_list[10];
    }

コンストラクターで、arraiesを初期化します。

/*NetworkEditor.cpp*/
    for (int i = 0; i < 10; i++)
    {
        VLLink* vl_link = NULL;
        while(vl_link == NULL)
        {
            vl_link = new VLLink;
        }
        vl_link->preLink = NULL;
        vl_link->nextLink = NULL;
        vl_link->link = NULL;

        VLLink* vl_link2 = NULL;
        while (vl_link2 == NULL)
        {
            vl_link2 = new VLLink;
        }
        vl_link2->preLink = NULL;
        vl_link2->nextLink = NULL;
        vl_link2->link = NULL;

        VL_list[i] = vl_link;
        temp_VL_list[i] = vl_link2;
    }

VLLinkは次のように定義されます。

typedef struct struct_VLLink
{
    CPhysicalLink* link;
    struct_VLLink* preLink;
    struct_VLLink* nextLink;
}VLLink;

次のように変更した場合:

    VLLink* VL_list2[10];
    VLLink* temp_VL_list2[10];
    for (int i = 0; i < MAX_VL_NUM; i++)
    {
        VLLink* vl_link = NULL;
        while(vl_link == NULL)
        {
            vl_link = new VLLink;
        }
        vl_link->preLink = NULL;
        vl_link->nextLink = NULL;
        vl_link->link = NULL;

        VLLink* vl_link2 = NULL;
        while (vl_link2 == NULL)
        {
            vl_link2 = new VLLink;
        }
        vl_link2->preLink = NULL;
        vl_link2->nextLink = NULL;
        vl_link2->link = NULL;

        VL_list2[i] = vl_link;
        temp_VL_list2[i] = vl_link2;

    }

大丈夫でしょう!?

4

1 に答える 1

0

@PeterHueneの提案とは別に、または類似のものに置き換える必要がVL_listあります。ループ内でのコードの重複を避けて、の初期化をコンストラクターに移動する必要があります。temp_VL_liststd::list<CPhysicalLink>VLLink

struct VLLink {
    VLLink() : link(NULL), prelink(NULL), nextlink(NULL) {}
    ...
};`

その後、@ MikeSeymourが言ったように、ループを減らすことができます

for (int i = 0; i < MAX_VL_NUM; i++) {
    VL_list[i] = new VLLink();
    temp_VL_list[i] = new VLLink();
}

メモリの問題の理由は、MAX_VL_NUM10より大きい可能性があります。したがって、MAX_VL_NUMどこでも使用するか、どこでも10を使用する必要があります。

そして今あなたの質問に;-)

に変えたら…大丈夫!?

あなたが何を達成したいのか誰も知らないので、誰もこれに答えることができません。私の最初の反応は間違いなくノーです!なぜなら、「理由だけで」変数を移動することは、ほとんどの場合悪い考えだからです。いくつかのランダムな症状を治すよりも、問題を分析して原因を修正する方がよいでしょう。

変更すると、クラスのメンバーからスタック上の自動変数への意味も変更されます。

于 2012-11-15T08:50:24.410 に答える