1

このエラーが発生し続けますvidprocess: malloc.c:2451: sYSMALLOc: Assertion (old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.

このステップで一度だけメモリを解放しています。

DIR *dp;
struct dirent *ep;     
dp = opendir (folder_input);
if (dp != NULL) {
    while ( (ep = readdir (dp)) && MAXVIDS != 0 ) {
        char *filename;
        filename = malloc(sizeof(char) * strlen(ep->d_name));
        strcpy(filename, ep->d_name);
        int len = strlen(filename);
        char *last_three = &filename[len-3];
        char trailer_file_name[100];
        int in_if = 0;
        if (strcasecmp(last_three, "MOV")  == 0) {
            strcpy(trailer_file_name, ep->d_name);
            MAXVIDS--;
            in_if = 1;
        }
        else if (strcasecmp(last_three, "MP4")  == 0) {
            strcpy(trailer_file_name, ep->d_name);
            MAXVIDS--;
            in_if = 1;
        }
        free(filename);

これは私が使用する唯一の場所free()です。この部分を使わないと上記のエラーが出ないので、メモリ解放でエラーが出ると勝手に推測しているのですが、なぜダメなのか分かりませんでした?

4

1 に答える 1

6

に十分なメモリが割り当てられていませんfilename:

    filename = malloc(sizeof(char) * strlen(ep->d_name));

これは、終端のヌルバイトにスペースを割り当てません。バイトが必要ですstrlen(ep->d_name) + 1。また、補足として、sizeof(char) == 1 常に.

また、この種のエラーについては、優れたメモリ デバッガーを使用すると時間を大幅に節約できます。プラットフォーム/アーキテクチャで利用できる場合は valgrind のようなもの、または別の同様のツールをお勧めします。

割り当てられたバッファをオーバーランさせると、 が簿記を行うために使用する内部データ構造が破損する可能性があります。malloc()これが、 でクラッシュが発生する理由ですfree()

于 2013-02-11T02:45:13.407 に答える