在构造函数之前未分配数组属性的内存?

时间:2012-11-15 01:39:19

标签: c++ memory-management constructor struct

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

在我的班上,我有两个属性:

/*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;

    }

没关系!?

1 个答案:

答案 0 :(得分: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。

现在问你的问题; - )

  

如果我把它改成......那就没问题了??

没有人能回答这个问题,因为没有人知道你想要达到什么目的。我的第一反应肯定是 No!,因为围绕“仅仅因为”移动变量几乎总是一个坏主意。分析问题并解决问题比解决一些随机症状更好。

您的更改还会修改堆栈中成员到自动变量的含义。