5

コードにこのようなものがあります

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_vern_tri

この種のエラーが発生した場合でも、プログラムはユーザーにアドバイスし、実行に従う必要があります。この場合、エラー ポイント以降に割り当てたすべてのものを解放したい (つまり、割り当てようとするとエラーが発生するmesh->trianglesが、mesh->vertices割り当てられているので、解放したいmesh->vertices)

それを行う簡単な方法はありますか?私が考えることができる唯一の方法 (これは避けたい方法です) は、多くのif (x==NULL)のコードをいっぱいにすることですが、これはメモリが割り当てられる順序のために非常に面倒です (すべてのエラーが発生する可能性があるポイントでは、そのポイント以降に割り当てられたすべてのものを解放するコードを作成する必要があります)。

明確かどうかわかりませんが、誰かが助けてくれることを願っています:)

4

2 に答える 2

2

の戻り値を常にテストする必要がありますmalloc()

これは次の良い使い方だと思いますgoto

int foo(void) {
    a = malloc();
    if (!a) goto aerr;
    b = malloc();
    if (!b) goto berr;
    c = malloc();
    if (!c) goto cerr;
    d = malloc();
    if (!d) goto derr;

    /* ... use memory ... */

    free(d);
derr:
    free(c);
cerr:
    free(b);
berr:
    free(a);
aerr:
    return 0;
}
于 2011-04-01T09:14:52.823 に答える
1

動的割り当ては割り当てごとに失敗する可能性があるため、面倒でも使用ごとに成功するかどうかを確認する必要があります。ただし、次の 3 つのポイントでのみ実行できます。

mesh = (fem_mesh *)malloc(sizeof(fem_mesh));

aftermesh->triangles = (unsigned int **)calloc(n_tri, sizeof(unsigned int *));と両方の割り当てを確認します。

ループの後、ループにチェックインします。

于 2011-04-01T09:12:50.607 に答える