2

char 配列を malloc して初期化します。

int i;
int length = 100;
char *arr = (char *) malloc (length * sizeof(char));
for (i = 0; i < length; i++) {
    arr[i] = i;
}

次に、中央の文字を '\0' に設定します。

arr[50] = '\0';

この場合、arr は 100 ではなく無効な長さ 50 しかないため、free を使用します。

free(arr);

これはメモリリークを引き起こす可能性がありますか? つまり、オペレーティング システムは malloc の長さを記録しますか、それとも単に strlen を使用して長さを判断しますか?

4

2 に答える 2

2

free割り当てられたメモリブロックのサイズを知っています。では、どのようにしてサイズを知るのでしょうか? これは実装に依存しますが、多くの場合、割り当てる実際のメモリ ブロックの開始直前にサイズを格納します。たとえば、Coliruでは、次のプログラムが表示されます113(113 は、実際に要求するよりも多くのメモリを割り当てていることを意味します)。

#include <iostream>

int main()
{
 char *arr = (char *) malloc (100 * sizeof(char));
 std::cout << *((std::size_t*)arr - 1) << std::endl;
}

これはかなり古くなっていますが、A Memory Allocatorを読むのは良い考えかもしれません。これにより、何がうまくいっているかがわかります (実際の実装とは異なる場合があることに注意してください)。

于 2013-07-02T03:58:22.990 に答える
1

いいえ、メモリの内容は動作に影響しませんfree()

free()これをヌルで終了する文字列として使用していたことを知りません。strlen()メモリのチャンクでは決して使用されません。

valgrind などのツールを試して、コードのリークをチェックしてください。

于 2013-07-02T03:51:07.330 に答える