内存分配

时间:2009-02-10 13:05:29

标签: c++ windows managed-c++

我的STRUCT1结构声明如下

typedef struct struct1 {
    short int nbr_fe;
    [size_is(nbr_fe)] STRUCT2  ptr_fe[*];
} STRUCT1;

STRUCT2也是STRUCT1

中的另一个结构

然后我有一个指针声明如下

typedef [ptr] STRUCT1 * ptr;

我必须在nbrRequested上为一个STRUCT1数组分配一个内存 到目前为止我已经

STRUCT1 obj1;
memset((void*)&obj1, '\0' , sizeof(STRUCT1));

for(int i1=0;i1<(int)nbrRequested;i1++) {
   STRUCT2 obj2;
   memset((void*)&obj2, '\0' , sizeof(STRUCT2));
   obj1.ptr_fe[i1] = obj2;
}

ptr ptr2;
ptr2 = &obj1;

但是如果nbrRequested大于500,则循环进入无限状态并且应用程序挂起。

有没有更好的方法来分配内存而不使用for循环

3 个答案:

答案 0 :(得分:3)

这个片段应该清除你需要malloc内存,清除它,然后你可以将指针分配给结构成员。

STRUCT1 listWU;
memset(&listWU, 0 , sizeof(STRUCT1));
for(int i1=0; i1<(int)nbrRequested; i1++) {
    STRUCT2 *temp;
    temp = malloc(sizeoF(STRUCT2));
    memset(temp, 0 , sizeof(STRUCT2));
    listWU.lst_Workunit_fe[i1] = temp;
}

哦,不要忘记当你完成这个结构时,你需要释放这个结构中malloc'的所有指针,否则你会有内存泄漏。

答案 1 :(得分:2)

你没有分配任何东西,你正在覆盖堆栈上的相同数据(当循环退出时,它会超出范围。

在C ++中,您使用new运算符分配内存。在C中你会使用malloc。因此,对代码的最小重写将是这样的(在C中,因为这似乎是您正在编写的内容)

// Allocate enough space for the array of `WF_LIST_WORKUNIT_P_FE`s
WF_LIST_WORKUNIT_P_FE listWU = malloc(sizeof(WF_STRUCT_WORKUNIT_FE) * nbrRequested);
memset(listWU, 0, sizeof(WF_STRUCT_WORKUNIT_FE) * nbrRequested));

当然,这只是将数组中的每个结构都设置为0,而不是更有意义的初始化,如果这是你想要的。

答案 2 :(得分:0)

因为这是一个C ++代码

我会使用new运算符,如下所示

WF_LIST_WORKUNIT_P_FE * listWU = new WF_STRUCT_WORKUNIT_FE [nbrRequested + 1];

catch是结构WF_STRUCT_WORKUNIT_FE本身是Structure WF_LIST_WORKUNIT_FE的嵌套结构 那是  typedef struct wf_list_workunit_fe
    {         short int nbr_Workunits_fe;         [size_is(nbr_Workunits_fe)] WF_STRUCT_WORKUNIT_FE lst_Workunit_fe [*];     } WF_LIST_WORKUNIT_FE;

不会为WF_LIST_WORKUNIT_FE工作分配内存吗?