-1

質問があります。私は sourgery C++ ツールチェーンを使用していますが、コンパイラは私に次の文を書かせます:

for(i=0;i<size_of_categories;i++){

    size_t size_of_tmp = sizeof(char) * (HOSTLINK_CONFIG_STRING_MAX_LEN * (categories[i].key_len));

    char tmp[size_of_tmp];
    memset(tmp,0,(size_of_tmp));    
    get_hostlink_count[i]++;

    if(categories[i].time == get_hostlink_count[i]){

        if(format == CSV){

            csv_this_category_values(categories,i,tmp,size_of_tmp);
            strncat(buffer,tmp,buff_len);

        }else if (format == JSON){

            xi_json_this_category_values(categories,i,tmp,size_of_tmp);
            js_this_cat = json_loads(tmp,JSON_DECODE_ANY,NULL);
            json_array_extend(js_arr,js_this_cat);

            json_array_clear(js_this_cat);
            json_decref(js_this_cat);
        }

        get_hostlink_count[i] = 0;

    }
    //Free(tmp);
}

私の問題は、スタックまたはヒープ内のこの文章割り当てメモリですか? forループで作成されているため、これはメモリリークを引き起こす可能性がありますか? これは、malloc を作成し、ループの最後に Free を作成することと同等ですか?

size_t size_of_tmp = sizeof(char) * (HOSTLINK_CONFIG_STRING_MAX_LEN * (categories[i].key_len));

    char tmp[size_of_tmp];
4

1 に答える 1

0

sを実行していないためmalloc、この特定のコードでメモリ リークが発生することはありません。tmpただし、一定でないサイズで配列を宣言することはできません。つまり、一定char tmp[size_of_tmp]size_of_tmpないとは言えません ( に依存するため、そうではありませんcategories[i].key_len)。

あなたができることは、このようにヒープ上の配列にメモリを使用mallocまたはcalloc割り当てることです

char *tmp = (char*)malloc(size_of_tmp);

またはこれ

char *tmp = (char*)calloc(size_of_tmp, sizeof(char));

calloc割り当てられたメモリはすべてゼロに初期化されているため、使用する必要はありませんmemset

メモリ リークを回避したい場合は、各ループ反復の最後にfree割り当てられたtmp配列を使用する必要があります。

于 2013-08-08T11:10:57.067 に答える