potisanのプログラミングメモ

趣味のプログラマーがプログラミング関係で気になったことや調べたことをいつでも忘れられるようにメモするブログです。はてなブログ無料版なので記事の上の方はたぶん広告です。記事中にも広告挿入されるみたいです。

C++ std::arrayとstd::vectorのメモリ確保場所(スタック、ヒープ)とWin32 APIの固定長文字列

Win32 APIの固定長文字列をSTLで扱うとき、バッファーの選択肢にstd::arraystd::vectorが挙げられます。 これらは連続したメモリ領域を管理する似たようなSTLコンテナクラスですが、メモリの確保場所が異なります。 それぞれの確保場所とその性質は次表のようにまとめられます(newで作成したクラスのメンバー変数のような静的配列もヒープに作成される場合は考慮していません)。

クラス 確保場所 メモリ確保コスト 一般的な確保可能サイズ 主なエラー 対応
std::array スタック 小さい 小さい スタックサイズがプログラムの設定値を超えた場合はスタックオーバーフロー T[N] ...;
std::vector ヒープ 大きい 大きい ヒープサイズがシステム設定を超えた場合はメモリアロケーションエラー new T[N], malloc(...)

MSVC(MSVS 2019)では既定のスタックサイズは1 MB(1024 KB)で(公式ドキュメント)、文字列処理で1024文字、MAX_PATH文字を確保する程度なら問題は生じないと思います。一方、前の関数がスタック上に大きなバッファーを確保している場合、スタックオーバーフローの可能性があります。

関数の設計時はバッファーの場所としてスタックとヒープ、あるいは両方を選ぶ必要があります。その度に悩むので、今後悩んだときの備忘録として。