1

次のコードには、文字列の最初の 3 文字のメモリ リークが含まれていますか?

char * str = (char*)malloc(21 * sizeof(char));
strcpy(str, "01234567890123456879");
str = str + 3;
free(str);

ありがとう。

4

3 に答える 3

11

リークよりも悪いのは、(または/ )freeから返されないポインターで呼び出すことは想定されていないことです。リークやクラッシュが発生する可能性があり、他に何があるかはわかりません...あなたがしていることは未定義の動作です。mallocrealloccalloc

于 2012-06-14T16:01:46.747 に答える
0

はい、漏れます。

freeによって返されたポインタが必要malloc/realloc/callocです。あなたが変わったから、きっと漏れる。

于 2012-06-14T16:03:25.263 に答える
0

テストでこれを証明したいかもしれませんが、あなたの質問に対する答えは、メモリリークが発生しているにもかかわらず、ポインタをインクリメントすると未定義の動作が発生する可能性があるということだと思います。

あなたの例のどこにも、割り当てられたメモリへの元のポインタを保持しているようには見えないので、私はこれを言っています。ベースアドレス以外の場所を指しているポインターで free が間違ったことをする可能性があります。

あなたがする必要があることを確認するために

1) システムで使用中の RAM を調べます。

2) プログラムを数回実行し、

3) 次に、メモリ使用量をもう一度見てください。

次に、コードを次のように変更して、すべてをもう一度試してください。

char * mem_ptr = (char*)malloc(21 * sizeof(char));
char * str = mem_ptr;

strcpy(str, "01234567890123456879");
str = str + 3;
free(mem_ptr);
于 2012-06-14T16:07:20.627 に答える