Безопасное размещение структуры, содержащей различные массивы в c

У меня есть что-то подобное в моем коде

typedef struct ts_fem_mesh
{   
    double          **vertices;
    unsigned int    **triangles;
    unsigned int    n_ver;
    unsigned int    n_tri;
} fem_mesh;

fem_mesh *fem_mesh_new(unsigned int n_ver, unsigned int n_tri)
{
    fem_mesh *mesh;
    mesh = (fem_mesh *)malloc(sizeof(fem_mesh));

    mesh->n_ver = n_ver;
    mesh->n_tri = n_tri;

    mesh->vertices = (double **)calloc(n_ver, sizeof(double *));
    mesh->triangles = (unsigned int **)calloc(n_tri, sizeof(unsigned int *));

    int i;
    for(i=0;i<n_ver;i++)
        mesh->vertices[i] = (double *)calloc(2, sizeof(double));
    for(i=0;i<n_tri;i++)
        mesh->triangles[i] = (unsigned int *)calloc(3, sizeof(unsigned int));
    return mesh;

}

Обычно, когда я вызываю fem_mesh_new , я использую очень большое число для n_ver и n_tri , что иногда приводит к ошибке распределения (недостаточно места).

Даже если я получаю такую ​​ошибку, моя программа должна посоветовать пользователю и проследить выполнение. В этом случае я хочу освободить все, что я выделил после точки ошибки (т.е. я получаю сообщение об ошибке, когда пытаюсь выделить сетку-> треугольники , но сетка-> вершины ) выделено, поэтому я хочу освободить сетку-> вершины )

Есть ли более простой способ сделать это? Единственный способ, которым я могу думать (которого я бы хотел избежать), - это заполнить мой код многих if (x == NULL) , но это очень раздражает из-за порядка, в котором выделена память (в каждой точке, где я мог получить ошибку, мне пришлось бы написать код, освобождающий все, что было выделено с этого момента).

Не знаю, ясно ли это, надеюсь, кто-нибудь может помочь: )

5
задан sashoalm 29 October 2011 в 16:20
поделиться