1

sbrk を使用してメモリを解放しているときに問題が発生しています。sbrk に負の値を渡しますが、ヒープの開始を減らしません。ここにコードがあります

int main(int argc, char** argv) {
    void * a = sbrk(0);
    printf("%p\n",a);

    sbrk(2);
    sbrk(-1);
    a = sbrk(0);
    printf("%p\n",a);
}

出力例は次のとおりです。

0x10734f000

0x10734f002

sbrk が 1 減らされた後、出力された値が 0x10734f001 として返されない理由がわかりません。

このプログラムで malloc を使用することは許可されていません。これは、sbrk を使用した malloc および free のカスタム実装用です。

4

4 に答える 4

2

MacOSX Mavericks でテストしたところ、sbrk() は 2 つの例外を除いて Linux と (ほぼ) 同じように動作します。

  • コンパイラの警告が表示されます: tst21.c:12:6: warning: 'sbrk' is deprecated [-Wdeprecated-declarations]
  • 負の値を使用して OS にメモリを返すことはできないようです (これは、私が覚えている限りでは、数十年前に SYSV4 で観察されたのと同じ動作です: によって割り当てられたメモリを解放することsbrk()はできませんでした) 。
于 2014-03-26T18:40:19.867 に答える
2

使用するサイズが小さすぎるため、内部で何らかの形の丸めが発生している可能性がありますsbrk()。このようなものにバイトレベルの精度は期待できません。ページ単位で動作する可能性が高くなります (通常の Linux システムでは 4 KB 程度です)。

また、マニュアルには次のように記載されていることに注意してください。

brk() と sbrk() の使用は避けてください。malloc(3) メモリ割り当てパッケージは、移植可能で快適なメモリ割り当て方法です。

malloc()は制限があることを認識し、それらを処理する可能性が高く、sbrk()アプリケーション レベルのインターフェイスとして推奨されます。

于 2014-03-26T16:06:38.567 に答える
-1

printf を使用せずに試してみて、デバッガーを使用して結果を出力してください。正常に動作し、期待どおりの結果が得られます。意図したとおり、ヒープは 2 ずつ増加し、-1 ずつ減少します。

于 2021-05-14T17:35:17.973 に答える