0

当我运行程序并新建一个 NetworkEditor 时,它会在构造函数中损坏,因为它会从数组的内存中读取。
当我一循环一循环地调试它时,就可以了!?
为什么?在进入构造函数之前,它没有为数组分配足够的内存吗?

在我的课堂上,我有两个属性:

/*NetworkEditor.h*/

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

在构造函数中,我初始化了数组:

/*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_NUM是大于 10。因此,您应该在任何MAX_VL_NUM地方使用或在任何地方使用 10。

现在回答你的问题;-)

如果我把它改成……就可以了!?

没有人能回答这个问题,因为没有人知道你想要实现什么。我的第一反应肯定是不!,因为“仅仅因为”移动变量几乎总是一个坏主意。与其解决一些随机的症状,不如分析问题并解决原因。

您的更改还会将含义从类成员修改为堆栈上的自动变量。

于 2012-11-15T08:50:24.410 回答