92486


競技プログラミングでメモリ制限が1024Mとなっていて、これ以上のメモリ使用ができないようにしたいのですが、コンパイラオプションでこれを実現するようなものがありましたら教えていただきたいです。


CC BY-SA 4.0
2022-11-28T08:27:03.360
92478
2022-11-28T23:08:52.037
55503
question
c++
C++でメモリ制限を指定した値にする方法はありますか？


Visual Studioのデバッグでメモリ使用量を測定するのでは駄目ですか？


CC BY-SA 4.0
2022-11-28T11:41:40.003
92483
2022-11-28T12:06:07.420
2022-11-28T12:06:07.420
3060
50767
92478
answer


C++であればメモリ確保・解放は次の4関数に集約されています。

[code]

    void* operator new(size_t size);
    void* operator new[](size_t size);
    void  operator delete(void* ptr);
    void  operator delete[](void* ptr);
    
[/code]

これらを再定義（内部で`malloc` /
`free`を呼ぶといいでしょう）してしまえば、メモリ確保・解放によるメモリ使用量の増減を把握できます。その上で`new`内で独自にメモリ上限を管理することで実現できるかと思います。

ただし、この方法は`malloc`他のメモリ確保には関与できていません。

* * *

> vector等のライブラリを使うときには難しいかもしれませんが

誤解されています。`std::vector`を含むSTL; 標準テンプレートライブラリやその他の適切に設計されたC++ライブラリは最終的に前述の`new`
/ `delete`を呼び出すように設計されています。  
一例として[`std::vector`](https://cpprefjp.github.io/reference/vector/vector.html)はメモリ操作にテンプレート型引数`Allocator`を使用し、省略時のデフォルト値は[`std::allocator`](https://cpprefjp.github.io/reference/memory/allocator.html)です。このため、`std::vector`が要素を確保する際は[`std::allocator::allocate()`](https://cpprefjp.github.io/reference/memory/allocator/allocate.html)を呼び出します。この関数は

> ストレージは、`::operator new(std::size_t)`の呼び出しによって取得される。

と説明のある通りです。


CC BY-SA 4.0
2022-11-28T12:19:24.807
92484
2022-11-28T22:48:05.833
2022-11-28T22:48:05.833
4236
4236
92478
answer


[unix](/questions/tagged/unix "'unix' のタグが付いた質問を表示") や
[linux](/questions/tagged/linux "'linux' のタグが付いた質問を表示") では `ulimit -d` ([man
bash](https://linuxjm.osdn.jp/html/GNU_bash/man1/bash.1.html))
でできるかもしれません。ちなみに [cygwin](/questions/tagged/cygwin "'cygwin' のタグが付いた質問を表示")
では無理でした。  
# って書くと「コンパイルオプションで」解決してないじゃんってかみつく人がいそう


CC BY-SA 4.0
2022-11-28T23:08:52.037
92486
2022-11-28T23:08:52.037
8589
92478
answer