継続的にメモリを割り当てる最短プログラム


49

少なくとも、割り当て可能なメモリ量のオペレーティングシステムの制限に達するまで、永久に実行され、実行時間が長くなるにつれてヒープ上により多くのメモリを割り当てるプログラムを作成します。

多くのカーネルは、実際に使用するまで割り当てたメモリを実際に予約しないため、プログラムがCまたは他の低レベル言語である場合、各ページに何かを書き込む必要があります。インタプリタ言語を使用している場合、おそらくこれを心配する必要はないでしょう。

最短のコードが優先されます。


13
スタックオーバーフローは有効なソリューションですか?メモリをリークする必要がありますか、それとも単に割り当てる必要がありますか?
小麦ウィザード

1
@WheatWizardメモリをリークする必要はありませんが、割り当てを解除するよりも速く割り当てる必要があります。
tbodt

2
あるプログラムが無限のメモリを消費するようにしたいとき、私はそれを得ることができません。(reduce conj [] (range))(Clojure)は最大737MBに達し、その後は成長を停止します。Idkがどのように継続的に上昇しないか。リスト全体を最後に印刷したいと思うので、何も捨ててはいけません。とてもイライラします。
発がん物質16

14
自分への注意:テストする前にコードを保存してください。MEM-リークが... IDEがクラッシュする可能性があります導入
steenbergh

1
これに似ているが別のゴルフチャレンジを追加する必要があると思います。これは、プログラムが時間の線形関数よりも速くメモリを消費することを要求します。以下のために、現在の課題、永遠にループして1バイトを割り当てること問題ないはずです。あなたのために新しい挑戦、それが不十分であるが、各時間のメモリ使用量を永遠にループして倍増することは大丈夫でしょう。
ベンゴールドバーグ16

回答:


46

Funge-98(cfunge)、1バイト

9

私はこれを以前に投稿していたでしょうが、それをテストすることに決め、コンピューターを使用可能な状態に戻すのに時間がかかりました。cfungeFungeスタックをオペレーティングシステムのヒープに格納します(小さなメモリ制限でプログラムを実行することで簡単に確認できます。これは以前に行ったはずのことです!)9。 Fungeプログラムは、デフォルトで行の終わりから先頭に戻ります)、メモリを永久に割り当てます。このプログラムは、一部のBefunge-93実装でも動作する可能性があります。

もっと面白い:

"NULL #(4

これは私の最初のアイデアであり、Fungeスタックに依存しない無限の割り当てです(ただし、Fungeスタックも爆破します)。まず、"コマンドはプログラムの残りのコピーをスタックにプッシュします(文字列であり、プログラムは折り返されるため、閉じ引用符は開き引用符としても機能します)。その後、Nリフレクト(デフォルトでは意味がありません)が発生し、プログラムが逆方向に実行されます。"再び実行され、スタックにプッシュするプログラム-と、この時他の方法でラウンドを、Nその後、プログラムは4文字の名前(とライブラリをロードし、ラップアラウンド-スタックの最上部に4(NULLライブラリはの一部でありますcfungeの標準ライブラリ)。NULL反映するすべての大文字を定義するため、L反映、#戻る途中でライブラリの読み込みをスキップし、4気にしないスタックをスタックにプッシュし、プログラム全体が最初から繰り返されます。ライブラリを複数回ロードすると効果があり、ライブラリのコマンドリストをライブラリのコピーごとに1回保存する必要があるため(これはFunge-98のセマンティクスによって暗示されています)、非スタックストレージを介してメモリをリークします(これはOSではなく言語に関連する「ヒープ」を定義する代替方法)。


2
私は...これを受け入れるつもりだ
tbodt

番号は9である必要がありますか?5だった場合も機能しますか?
tbodt

スタックにプッシュするものはすべて動作します(可能性を除く0; Funge実装またはOSは、問題のメモリが既にゼロでいっぱいである場合、最適化する方法を見つけることができる可能性があります)。私は9勝手に選んだ。

22
Unaccepting私は私の評判はまだ666になりたいので
tbodt

7
@tbodt受け入れない本当の理由ではありません。ご希望の場合は、あなたの質問に-1を差し上げます。その後、承認すると、まだ703になります(666ではなく703になります)。
NoOneIsHere

30

Brainfuck、5バイト

+[>+]

これには、テープの長さに制限のないインタプリタが必要です。


2
私はそれが+ [> +]であると確信しています。さもないと、最初の反復で停止します。;)
パリス・ドゥアディ

あなたは正しい、タイプミスでごめんなさい。
VSZ

40
brainfuckソリューションは、競争力がある希少な時代の一つ...
FlipTack

@ Flp.Tkcしかし、それはまだ負けています。多分それはなります勝つ ...いつか
NoOneIsHere

6
@SeeOneRhino:それはすでに、一度獲得したすべてのゴルフの言語>破っcodegolf.stackexchange.com/questions/8915/...を
VSZ

22

Bash + coreutils、5

または

ルビー、5

`yes`

yes無限の出力を生成します。置くyesバッククォートにすると、すべての出力をキャプチャして、コマンドとしてその出力を実行するためにシェルに指示します。Bashは、ヒープがなくなるまで、この終わりのない文字列にメモリを割り当て続けます。もちろん、結果の出力は無効なコマンドになりますが、それが起こる前にメモリを使い果たす必要があります。

これを指摘してくれた@GBのおかげで、これもルビーの多言語です。


7
私は同じことを書いて、それをRubyプログラムと呼ぼうとしていました。
GB

1
そしてperl、私は思う。
16

18

Python、16バイト

aエラーに達するまでネストを続けます:

a=0
while 1:a=a,

最初のいくつかの反復(タプルとして)は次のようになります。

0
(0,)
((0,),)
(((0,),),)

などなど。


18

> <>(魚)、1バイト

0

ここで試してみてください!

0 実際には、16進数1-fの代わりに使用できます。

説明

0in> <>は、魚が泳ぐための1x1コードボックスを単に作成します。常に0スタックに追加し、右に泳ぎ、ループに戻り0、再びスタックに追加します。これは永遠に続きます。


2
今、私はこれが機能する他の2次元言語がいくつあるのだろうと思っています。結局のところ、それらのほとんどはスタックベースです。

1
ほとんどCubixで動作しますが、実行行.に移動する0には先頭の(または空白以外の文字)が必要です。
ETHproductions 16

1
で作品ウロボロスはなく、同じように:インタプリタは読み取ろうとする0000000...単一の整数リテラルとして、それがたまるという文字列は、より多くのメモリを服用し続けるものです。これと同じように機能するプログラムは、a無限に10を押します。
DLosc 16

12

Java 101バイト

class A{public void finalize(){new A();new A();}public static void main(String[]a){for(new A();;);}}

オブジェクトを作成して捨てた後、メインプログラムを無限ループでキャッチします。ガベージコレクションは、削除されたオブジェクトごとに2つのオブジェクトを作成することにより、リークの役割を果たします。


さて、私は今明白なことに行かないために少しばかげていると感じます、ハハ。私はこれが私のものよりもエレガントであると言うこと
ポケ

1
はい、あなたのコードはfinalize()@poke
masterX244で

私はあなたが初期化子、静的でメイン置き換えることによって、それを短くすることができると思う
tbodt

唯一Java6の最大動作し、私は周りの以降のバージョンを持って
masterX244

2
ハガガベージコレクターを使用してリークを引き起こす!素晴らしいアイデア:)
マークKコーワン

12

Perl、12バイト

{$"x=9;redo}

perlでは、x左側に文字列があり、右側に数字がある演算子は、繰り返し文字列を生成します。したがって、と"abc" x 3評価され"abcabcabc"ます。

x=オペレータが突然変異その右側が示すように何回もそれの内容を繰り返した結果とその左側に変数の内容を置き換える左引数。

Perlには、いくつかの奇妙な名前の組み込み変数がいくつかあります。そのうちの1つは$"初期値が1つのスペースです。

redoオペレータは、囲んでいるの先頭にジャンプします{}

初めてx=オペレータが実行され、それはの値変化$"から" ""に" "9つのスペースです。

x=演算子が2回実行されると、$"to の値" "が81スペースに変更されます。

3回目$"は、729バイト長のスペース文字列になります。

あなたはこれがどこに向かっているのかを見ることができると思います:)


あなたはそれに私を打ち負かした!そして、あなたのものは3バイト短くなります。
ガブリエルベナミー16

1
このWebサイトで最小のループを検索するだけでした:)。また、最初は$_.=7ループ内にありましたが、使用できるx=場合ははるかに高速にメモリ不足になることを認識し、実行しperldoc perlvarて適切なものを選択しました。
ベンゴールドバーグ16

{$^O++;redo}とき1バイト短い^O単一であるchr(15)バイト。かなり遅い速度でメモリを浪費しますが、1バイトを浪費するにはWindowsで1000000000回の反復が必要です。名前がラテン文字で始まるすべてのOSで動作します。
オレグV.ボルコフ

11

sed、5バイト

ゴルフ

H;G;D

使用法(どの入力でも可能)

sed 'H;G;D' <<<""

説明した

#Append a newline to the contents of the hold space, 
#and then append the contents of the pattern space to that of the hold space.
H

#Append a newline to the contents of the pattern space, 
#and then append the contents of the hold space to that of the pattern space. 
G

#Delete text in the pattern space up to the first newline, 
#and restart cycle with the resultant pattern space.
D

スクリーンショット

ここに画像の説明を入力してください

オンラインでお試しください!


2
厳密に言えば、これはGNU sedです(セミコロンは標準sedではありません)が、とにかくセミコロンと同様に改行も機能します。
R ..

10

Haskell、23 19バイト

main=print$sum[0..]

無限リストの合計を出力します


これは評価を実施する良い方法であり、非常にコンパクトです。+1
エソランジングフルーツ

コンパイラはこれをO(1)メモリで非常にうまく実行できます。GHCでは、sumと定義されfoldl (+) 0ていますが、サンクのパンクを防ぐために、厳密性分析を停止してキックインするのは何ですか?最適化してコンパイルして実行しましたか?
ウィルネス

@WillNess答えは何でしょうか?sumリストが無限であることを事前に知らないので、print最初にリストを評価する必要があります。そして、はい、私は最適化とそれをコンパイル
Angs

答えはありません。しかし、計算はO(1)スペースで実行されます。おっと、デフォルトはに設定されているIntegerため、数値は制限されておらず、bignumの現在の結果で使用されるメモリは実際に増加することになります。
ウィルネス

1
明確にするために、私が意図したことは、命令ループがするのと同じように、の計算がsum xs = foldl (+) 0 xs一定のスタックで実行できるということでした。確かになります。したがって、特定のメモリを割り当てる唯一のことは、bignumの中間結果です。foldl' (+) 0 xs
ウィルネス

9

C ++(g ++コンパイラーを使用)、27 23 15バイト

4バイトの削除を手伝ってくれたNeopに感謝

このソリューションでは、スタック上のすべてが割り当てられ、スタックオーバーフローが発生するため、実際にはメモリがリークすることはありません。単に無限に再帰的です。各再帰により、スタックがオーバーフローするまでメモリが割り当てられます。

main(){main();}

代替ソリューション

このソリューションは実際にメモリをリークします。

main(){for(;;new int);}

Valgrindの出力

これは、実行時間の数秒後にプログラムを終了した後のValgrindの出力です。確かにメモリがリークしていることがわかります。

==2582== LEAK SUMMARY:
==2582==    definitely lost: 15,104,008 bytes in 3,776,002 blocks
==2582==    indirectly lost: 0 bytes in 0 blocks
==2582==      possibly lost: 16 bytes in 4 blocks
==2582==    still reachable: 4 bytes in 1 blocks
==2582==         suppressed: 0 bytes in 0 blocks

3
タイトルは誤解を招くものです。質問は「永久に実行され、継続的にメモリを割り当てるプログラムを書く」と言っています。
NobodyNada 16

ああ、私が私のものを送ったときにあなたがすでに答えを提出したことに気づきませんでした。
Neop

1
@Neopまあ私はint あなたがそう感謝するのを見るまであなたが省略できることを知りませんでした!
小麦ウィザード

2
ではなくC++、そのg ++​​方言だけです。C++はmainの呼び出しを禁止します。C ++にはint main...宣言が必要です。しかし、解決策はまだきれいです:
マーティンBa

1
実際、C ++はを呼び出すことを禁止していmainます。
R ..

9

JAVA、 81 79 78バイト

JAVA(ホットスポット) 71 70バイト

私が投稿した他のJavaの回答よりも短い(81、後で79バイト):

class A{public static void main(String[]a){String x="1";for(;;)x+=x.intern();}}

@OlivierGrégoireが示唆したように、さらにバイトを保存できます。

class A{public static void main(String[]a){for(String x="1";;)x+=x.intern();}}

x+=x.intern()forステートメントを終了するにはセミコロンが必要なので、forループのインクリメントとして配置しても何の助けにもなりません。

@ETHproductionsが示唆するように、使用x+=xするだけでも機能します。

class A{public static void main(String[]a){String x="1";for(;;)x+=x;}}

@OlivierGrégoireのヒントからも恩恵を受けることができます。

class A{public static void main(String[]a){for(String x="1";;)x+=x;}}

私の唯一の不安は、ヒープにデータを割り当てることが保証されていないことです。効率的なJVM xは、ローカル関数を決してエスケープしないことを簡単に理解できるからです。使用するとintern()、インターンされた文字列が最終的に静的フィールドに格納されるため、この懸念を回避できます。ただし、HotSpotはOutOfMemoryErrorそのコードに対してを生成するため、大丈夫だと思います。

更新:@Olivier Gregoireは、大量のメモリが利用可能な場合ではなく、x+=xコードが実行される可能性があることも指摘しました。これは、Javaが32ビット型を使用して配列にインデックスを付けるためです(文字列はの配列にすぎません)。後者に必要なメモリは文字列の長さが2次であるため、これはソリューションに影響を与えません。したがって、割り当てられた2 ^ 62バイトのオーダーまでスケールアップする必要があります。StringIndexOutOfBoundsExceptionOOMintcharx+=x.intern()


PPCGへようこそ!私はJavaをよく知りません。あなたがちょうどやったらどうなりますx+=x;か?
ETHproductions 16

あなたは入れてセミコロンをオフに剃ることができますx+=x.intern()forループの最後のセミコロンの後ろに
masterX244

素敵な答え。弦楽器には何かしなければならないことはわかっていましたがintern、Unsafeにはかなり満足していました。もともと、この質問では「メモリリーク」が指定されていたため、文字列連結の回答をしなかったのです。
ポケ

回答がJavaの特定の実装に依存しており、必ずしもすべてのJava実装に移植できるとは限らない場合は、タイトルに情報を入れることができます(例:)# Java (HotSpot), 71 bytes。そうすれば、ソリューションが不正行為を起こす可能性について心配する必要はありません。実装固有のプログラムは、ゴルフだけでなく、プログラミングのより広い世界でも一般的であり、あなたがしていることを知っている限り、例えば、オフスクリプト。

1
うーん... x+=x;メモリ全体を使い果たすことはありません。64 GBではStringIndexOutOfBoundsException、OOMではなくが表示されます。と.intern()私はまだOOMを取得します。
オリビエグレゴワール



6

Python 3、16バイト

i=9
while 1:i*=i

これは、Python 3には整数サイズに制限がないという事実に基づいています。代わりに、整数はシステムが処理できる限りのメモリを占有する可能性があります(これについての私の理解がおかしい場合は、修正してください)。


タイトルは、メモリがリークすることを意味します。しかし、これは実際にはメモリをリークしません。著者はおそらく明確にする必要があります。
小麦ウィザード

6

さび、46バイト

fn main(){loop{std::mem::forget(Box::new(1))}}

このRustプログラムについて、メモリ不足になるまでヒープの割り当てをリークしていることに注目してください。

そうです、安全でないブロックはありません。Rustは安全なコードでメモリの安全性を保証します(初期化されていないデータの読み取り、解放後の読み取り、二重解放など)が、メモリリークは完全に安全と見なされます。ここで使用しているスコープ外変数のRAIIクリーンアップをコンパイラーに忘れさせる明示的な関数もあります。


6

TI-83六角アセンブリ、7バイト

PROGRAM:M
:AsmPrgm
:EF6A4E
:C3959D
:C9

ERR:MEMORYOSによってがスローされるまで、appvarsを無期限に作成します。で実行しAsm(prgmM)ます。16進数の各ペアを1バイトとしてカウントします。


6

Python、8バイト

2**9**99

OPは、技術的には「永遠に」実行されないプログラムの専門性を認めているが、任意のコンピュータよりも多くのメモリ割り当ては、おそらく扱うことができます。これはまったくgoogolplexではありません(つまり10**10**100、11バイト)が、単純に、数値の2を底とする対数は

>>> 9**99.
2.9512665430652752e+94

すなわち、それを表す10 ^ 94ビット。WolframAlphaは、それをディープウェブよりも10 ^ 76大きいと言います(宇宙には約10 ^ 80の原子があることに注意してください)。

なぜ9ではなく2を要求するのですか?それほど大きな違いはありません(9を使用しても、ビット数はの係数で増加するだけでlog2(9) = 3.2、指数は変更されません)。しかし、一方で、計算は簡単なので、プログラムは2ではるかに高速に実行されます。これは、9バージョンとは異なり、すぐにメモリがいっぱいになることを意味します。バージョン9は、必要な計算のために少し時間がかかります。必要ではありませんが、これを「テスト」したい場合には便利です(これは私が行いました)。


5

ゼリー3 2 バイト

デニスのおかげで-1バイト(Wラップ)

完全なプログラムとしても機能するリンク(関数またはメソッド)。入力をリストに再帰的にラップします。

ゼロとして入力開始最初のパスリストを作成するように、[0]
第二のパスは、次に、これを行う[[0]]
第3のパスは、次に、これを行う[[[0]]]
ようにし、...


前の3バイト、より速くリーク:

;Ẇß

入力のすべての空でない連続したサブリストを入力に再帰的に連結します。
[0]-> [0,[0]]-> [0,[0],[0],[[0]],[0,[0]]]など...


ルールを正しく理解していれば、‘ß十分でしょう。
デニス

それは本当に「継続的にメモリを割り当てる」のですか(Pythonが小さな整数の定数割り当てを維持することを考える)。
ジョナサンアラン

1
けっこうだ。それでも法案に合うはずです。
デニス

5

Java 7、106バイト

class A{public void finalize(){for(;;)Thread.yield();}public static void main(String[]a){for(;;)new A();}}

少ないゴルフ

class A{
    @Override
    public void finalize(){
        for(;;) {
            Thread.yield();
        }
    }
    public static void main(String[]a){
        for(;;){
            new A();
        }
    }
}

このfinalizeメソッドは、ガベージコレクションがオブジェクトへの参照がこれ以上ないと判断したときに、ガベージコレクタによってオブジェクトに対して呼び出されます。単にガベージコレクターが実際にメモリを解放しないように、このメソッドを永遠にループするように再定義しました。でmainループ私は、これはすべての利用可能なメモリを使用しますので、最終的にクリーンアップすることはありません新しいオブジェクトを作成します。

Java 7(代替機能)、216バイト

import sun.misc.*;class A{public static void main(String[]a)throws Exception{java.lang.reflect.Field f=Unsafe.class.getDeclaredField("theUnsafe");f.setAccessible(1>0);for(;;)((Unsafe)f.get(null)).allocateMemory(9);}}

少ないゴルフ

import sun.misc.*;
class A{
    public static void main(String[]a)throws Exception{
        java.lang.reflect.Field f=Unsafe.class.getDeclaredField("theUnsafe");
        f.setAccessible(true);
        Unsafe u = (Unsafe)f.get(null);
        for(;;) {
            u.allocateMemory(9);
        }
    }
}

これは何よりも楽しいものです。この答えUnsafeは、文書化されていない内部API であるSunライブラリを利用しています。制限されたAPIを許可するには、コンパイラの設定を変更する必要がある場合があります。Unsafe.allocateMemoryヒープ上になく、Javaのガベージコレクター管理下にない指定されたバイト量(境界チェックなし)を割り当てるため、このメモリはUnsafe.freeMemory、呼び出すかjvmがメモリを使い果たすまで保持されます。


1
ここにJavaが表示されるかどうか疑問に思っていました。
魔法のタコUr

最初のものは、ガベージコレクターが別のスレッドで実行されている場合にのみ機能しませんか?
tbodt 16

@tbodtはい、しかしこれはそうではないとは思わない。ガベージコレクションは、ガベージコレクターと呼ばれるデーモンスレッドで発生します
ポケ

@Pokeは保証されていますか?ない場合は答えは罰金はまだですが、あなたはそれが唯一の独自のスレッドでガベージコレクタが実行された場合に動作することを明確にすべき
tbodt

@tbodtそう思いますが、正直なところ、確信がありません。
ポケ

5

Haskell、24バイト

f x=f$x*x
main=pure$!f 9

Haskellの主な問題は、怠に打ち勝つことです。main何らかのIOタイプが必要なので、単純に呼び出してmain=f 9も機能しません。使用してmain=pure(f 9)リフトのタイプf 9IO種類を。しかし、のような構築物を用いてmain=pure 9何もしない、9そうの引数を評価する必要はありません、返品どこにも表示されませんが、単に破棄されpure、したがって、main=pure(f 9)任意のメモリが割り当てられるとされることはありませんfと呼ばれていません。評価を実施するために、$!演算子が存在します。関数を引数に単純に適用しますが、最初に引数を評価します。したがって、main=pure$!f 9評価fを使用すると、より多くのメモリが継続的に割り当てられます。


コンパイルすると、ランタイムはループや休憩の実行を検出
Angs

@Angs Windowsでghcを使用してコンパイルしましたが、メモリを喜んで割り当て続けています... 3GBで停止しました。
ライコニ16

f x=f x作品も使用しますか?(-2バイト)
wchargin

@wcharginそうは思わないf x=f x、無限ループを生成するが、新しいメモリを割り当てない。
ライコニ16

いいですね、bignumの計算によってメモリが切れてしまいます!f!x=x*f(x*x)最適化を保証する必要があります。
ウィルネス

5

dc、7バイト

[ddx]dx

[ddx]「ddx」を含む文字列をスタックにプッシュします。dx複製し、コードとして実行します(スタックに1つのコピーを残します)。実行されると、2つの複製を作成してから1つを実行し、そのたびにスタックにもう1つのコピーを残します。


待ってください。並列に実行できる場合、これは指数関数的にメモリを割り当てますか?
HyperNeutrino 16

5

Haskell(ghc 8.0.1を使用)、11バイト

m@main=m>>m

非末尾再帰。main自分自身を呼び出してから、再び自分自身を呼び出します。


これはヒープまたはスタックに割り当てられますか?(私はどちらかを信じることができます;それは使用においてHaskellコンパイラに依存するかもしれません。)

1
@ ais523:状況によります。Haskellには呼び出しスタックがありません。ランタイムシステムRTSには、「スタック」とも呼ばれるパターンマッチング用のメモリ領域があります。このスタックはヒープに割り当てられます。正直なところ、ここで何が起こっているのかわかりません。なぜなら、プログラムがStack space overflow: current size 33624 bytes.33kで失敗するのは、OSが報告している6Gの合計メモリとは対照的にかなり低いようだからです。
nimi

1
@ ais523:ghcエラーメッセージのメモリ情報にバグがあるようです。そのため、正確に何が起こるかを伝えるのは困難です。
nimi

Ubuntuの上でGHC 7.10.3でコンパイルされた、これは最適化が無効になっている場合でも、メモリの一定量を要すると思われる
Angs

@Angs:うーん、MacOSではghc 8.0.1を使用しています。これを編集します。
nimi

5

C(Linux)、23バイト

main(){while(sbrk(9));}

sbrk()データセグメントの先頭を指定されたバイト数だけインクリメントします。これにより、少なくとも出力VIRTフィールドで報告されているように、プログラムに割り当てられたメモリの量を効果的に増やしtopます。これはLinuxでのみ動作します-macOSの実装は明らかに4MBまでしか割り当てられないエミュレーションです。


少し一般的な答え:

C、25バイト

main(){while(malloc(9));}

macOS Activity Monitorで見ました。約48 GBまで処理され、最終的にプロセスはSIGKILLシグナルを受信しました。FWIW私のMacbook Proは16GBです。使用されるメモリのほとんどは圧縮されていると報告されました。

この質問では、各割り当てを効果的に書き込む必要があることに注意してください。これはここでは明示的に行われません。ただし、すべてのmalloc(9)呼び出しについて、割り当てられるのはユーザーが要求した9バイトだけではないことに注意することが重要です。割り当てられた各ブロックには、ヒープのどこかから割り当てられるmallocヘッダーがあります。これは、malloc()内部によって必ず書き込まれます。


mallocでは、mallocは何も初期化しないため、メモリに直接書き込むことはありません。mallocはメモリ管理のために内部ストレージを必要とするため、メモリのみが割り当てられます。したがって、答えは本当に標準ではありませんが、とにかくどこでも動作すると思います。
Antzi 16

@Antziはい。ただし、ユーザーメモリが書き込まれる前に実際に割り当てられmalloc()ない場合でも、各edブロックにはまだ実際に割り当てられたスペースが必要であるため、これはまだ機能すると考えています。これはmacOSおよびUbuntuで機能します。
デジタル外傷

書き込まれている各ページの問題の条件は、かなり無意味です。OSが適切なコミットアカウンティングを行わないと仮定したい場合でも、実装の詳細に関係なく、割り当てごとに必要なブックキーピングの量は必ずゼロではありません。割り当てに隣接している(ページにアクセスする)かどうかにかかわらず、最終的に(必要に応じて)ゼロ以外のデータでブックキーピングのためにメモリを任意に消費します。
R ..

として1バイト小さくすることができmain(){main(malloc(9));}ますが、オーバーフローをスタックしないために、末尾呼び出しの最適化が必要であり、gccはそれを実行したくないようですmain...
R ..

malloc(9)をcalloc(9,9)に置き換えると、9バイトブロックの9つのインスタンスに十分なメモリが割り当てられます(したがって、アライメントに応じて81〜144バイトになります。しかし、さらに重要なことは、calloc( )メモリブロックをゼロで埋め、基盤となるOSにストレージを割り当てさせます
CSM

5

Perl、4バイト

do$0

現在のインタープリターで自分自身を実行します。終了すると、実行は呼び出しスクリプトに戻りますが、これには呼び出しスタックが必要です。


素晴らしく短いですが、私のようにメモリをすぐに無駄にすることはありません。
ベンゴールドバーグ16

4

ラケット、13バイト

(let l()(l)1)

私の答えがこの質問に該当するかどうかは完全にはわかりません。この回答を削除する必要がある場合はお知らせください。


仕組みを説明できますか?
tbodt 16

1
ああ、だからそれlは非末尾呼び出し再帰を行う関数として定義しています。それは重要だと思います。
tbodt 16

@tbodtはい、あなたは右のお金にしている
Winnyの

4

JavaScript 22 21 17 16 15バイト

for(a=0;;)a=[a]

@Jonathan AllanのJelly answerのように、リストを別のリストにラップすることで4バイトを節約しました。

@ETHProductionsのおかげで1バイト節約

代替ソリューション15バイト(適切なテールコールでのみ動作します)

f=a=>f([a]);f()

1
ES6を使用した2番目の例では、できませんf=_=>f();f()か?12バイト
噛まれた

@bittenよく分かりません。コールスタックを爆破するためにカウントする場合、適切なテールコールを持たないコールスタックがその方法です。TCOを使用すると、メモリリークが発生するとは思わないでしょうか。
Lmis 16

どちらも私のためにコールスタックを爆破します。私はテールコールにあまり詳しくないので、コメントすることはできません。
噛まれた

1
ああ、私はあなたのメモリがどのように漏れているのかわかりませんでした
噛まれ

1
削除できa=0ます。最初の反復の結果は次のようになりますa=[undefined]
Florent

4

ルビー、11バイト

loop{$*<<9}

にプッシュ9$*続けます。これは、最初はRubyプロセスへのコマンドライン引数を保持する配列です。


4

05AB1E、2バイト

[A

オンラインでお試しください!abcdefghijklmnopqrstuvwyxz永遠にスタックに プッシュし続けます。

可能なすべての2バイトソリューション:

[  # Infinite loop.
 A # Push alphabet.
 0 # Push 0.
 1 # Push 1.
 2 # Push 2.
 3 # Push 3.
 4 # Push 4.
 5 # Push 5.
 6 # Push 6.
 7 # Push 7.
 8 # Push 8.
 9 # Push 9.
 T # Push 10.
 X # Push 1.
 Y # Push 2.
 ® # Push -1.
 ¶ # Push \n.
 º # Push len(stack) > 0, so 0 once then 1 for eternity.
 ð # Push a space.
 õ # Push an empty string.
 ¾ # Push 0.
 ¯ # Push [].
 M # Push -inf.
 ) # Wrap current stack in an array.

非常に徹底的です!いいね
timothymh 16

3

Python、35バイト

def f(a=[]):a.append(a)
while 1:f()

a リリースされることはなく、ヒットするまで大きくなります MemoryError

Python Tutorで実行を表示できます。


1
できますかa+=a,
チョイス16

機能のための必要はありません、ここにいない私のゴルフ、それの
FlipTack

@ Flp.Tkcこの回答を書いた後、質問が変更されました。現在の形式であれば、あなたがしたこと(+-数文字)をしたでしょう。
ノエルクド16

3

TI-BASIC、8

:Lbl A
:While 1
:Goto A

(すべて1バイトのトークンと2つの改行)

Whileによって閉じられることが予想されるなどの構造化された制御フローEndがスタック上の何か(OSスタックではなく、ヒープメモリ内の別のスタック)をプッシュして追跡するため、これはメモリを継続的にリークします。しかし、ここではGotoループから抜けるために使用しているので(Endスタックからモノを削除するためにno が実行されます)、While再び表示され、モノが再びプッシュされます。ERR:MEMORY

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.