1. ホーム
  2. c

[解決済み] テスト

2022-02-13 21:28:58

質問

が表示されます。

malloc: *** error for object 0x1001012f8: incorrect checksum for freed object
        - object was probably modified after being freed.
        *** set a breakpoint in malloc_error_break to debug

のエラーが発生しました。

char* substr(const char* source, const char* start, const char* end) {
    char *path_start, *path_end, *path;

    int path_len, needle_len = strlen(start);

    path_start = strcasestr(source, start);
    if (path_start != NULL) {
        path_start += needle_len;
        path_end = strcasestr(path_start, end);
        path_len = path_end - path_start;
        path = malloc(path_len + 1);
        strncpy(path, path_start, path_len);
        path[path_len] = '\0';
    } else {
        path = NULL;
    }

    return path;
}

どうすればうまくいくのでしょうか?を使ってメモリを確保する関数を書き換えたところ path[path_len + 1] は正常に動作します。

さて、私が理解していない部分は、私が一度も free というのも、割り当てられたメモリはすべて、それが存在するまでの間、プログラムに必要だからです(AFAIKでは、とにかく割り当てられたメモリはすべて無効になるのでしょうか!)。

では、一度も解放していないのに、解放されたオブジェクトが破損することはあるのでしょうか?

この中で関数が呼び出されます。

char *read_response(int sock) {
    int bytes_read;
    char *buf = (char*)malloc(BUF_SIZE);
    char *cur_position = buf;

    while ((bytes_read = read(sock, cur_position, BUF_SIZE)) > 0) {
        cur_position += bytes_read;
        buf = realloc(buf, sizeof(buf) + BUF_SIZE);
    }

    int status = atoi(substr(buf, "HTTP/1.0 ", " "));

そこには realloc 使い方が間違っているのでしょうか?私は完全なサーバー応答を読みたいので、反復のたびに再割り当てしなければなりませんね?

どのように解決するのですか?

read_response で指定されたバッファの終端を上書きしているのでしょう。 buf .

問題は、buf がポインタであることです。 sizeof(buf) はポインタのサイズ(CPUにもよりますが、おそらく4か8)を返します。あなたが使っているのは sizeof あたかも buf これは、ある文脈では互換性があるように見えますが、C言語ではポインタと同じものではありません。

を使う代わりに sizeof に割り当てた最後のサイズを記録しておく必要があります。 buf を追加し、さらに BUF_SIZE を、バッファを拡大するたびに追加してください。

また read と比べて、返す文字数がかなり少なくなる可能性があります。 BUF_SIZE を呼び出すと、その都度 reallocbuf を各反復で使用するのはやりすぎかもしれません。ただ、必要以上にメモリを消費してしまうだけで、正しさの点では問題はないでしょう。

私なら、もっと下のコードのようなことをします。

#define MIN_BUF_SPACE_THRESHOLD (BUF_SIZE / 2)

char *read_response(int sock) {
    int bytes_read;
    char *buf = (char*)malloc(BUF_SIZE);
    int cur_position = 0;
    int space_left = BUF_SIZE;

    if (buf == NULL) {
        exit(1); /* or try to cope with out-of-memory situation */
    }

    while ((bytes_read = read(sock, buf + cur_position, space_left)) > 0) {
        cur_position += bytes_read;
        space_left -= bytes_read;
        if (space_left < MIN_BUF_SPACE_THRESHOLD) {
            buf = realloc(buf, cur_position + space_left + BUF_SIZE);
            if (buf == NULL) {
                exit(1); /* or try to cope with out-of-memory situation */
            }
            space_left += BUF_SIZE;
        }
    }

このバージョンでは、もし read の呼び出しが数バイトのデータで戻ってくるだけです。