Win32 APIの固定長文字列をSTLで扱うとき、バッファーの選択肢にstd::array
とstd::vector
が挙げられます。
これらは連続したメモリ領域を管理する似たようなSTLコンテナクラスですが、メモリの確保場所が異なります。
それぞれの確保場所とその性質は次表のようにまとめられます(newで作成したクラスのメンバー変数のような静的配列もヒープに作成される場合は考慮していません)。
クラス | 確保場所 | メモリ確保コスト | 一般的な確保可能サイズ | 主なエラー | 対応 |
---|---|---|---|---|---|
std::array |
スタック | 小さい | 小さい | スタックサイズがプログラムの設定値を超えた場合はスタックオーバーフロー | T[N] ...; |
std::vector |
ヒープ | 大きい | 大きい | ヒープサイズがシステム設定を超えた場合はメモリアロケーションエラー | new T[N] , malloc(...) |
MSVC(MSVS 2019)では既定のスタックサイズは1 MB(1024 KB)で(公式ドキュメント)、文字列処理で1024文字、MAX_PATH
文字を確保する程度なら問題は生じないと思います。一方、前の関数がスタック上に大きなバッファーを確保している場合、スタックオーバーフローの可能性があります。
関数の設計時はバッファーの場所としてスタックとヒープ、あるいは両方を選ぶ必要があります。その度に悩むので、今後悩んだときの備忘録として。