5

私は一連の画像処理プログラムに取り組んできました..空想的なものは何もなく、主に迅速で汚い実験を行っています。画像データは、スタック上で宣言されたベクトルに格納されます (データを渡す必要がない場合は、ポインターを使用する必要がないようにしています)。数え切れないほどのデバッグとステップ実行にもかかわらず、関数の一部が非常に奇妙な動作をしていることに気付きました。デバッガーが特定の変数を評価できないなどのエラーを表示することがあります。物事は一般的に意味をなさないだけであり、過去の経験から、これが発生すると、何らかのオーバーフローまたはメモリ破損が発生していることを意味することがわかりました。最初に頭に浮かんだのは、おそらく大量の画像データをベクトルに格納したためだろうということでした。

ただし、ベクトルは実際のデータをヒープに格納するという印象を受けていたので、これらの大きなベクトルをいくつかスタックに置いても害はないと考えました。この考え方は間違っていますか?ベクトルを割り当てて、スタックではなくヒープに格納する必要がありますか?

ありがとう、

4

3 に答える 3

7

[...]ベクトルは実際のデータをヒープに保存します

vectorは、他のすべてのコンテナーと同様に、メモリ管理にアロケーター オブジェクトを使用します。通常、テンプレートの 2 番目のパラメーターとして何も指定しない場合は、既定のアロケーターであるstd::allocatorfrom<memory>が使用されます。メモリを予約するのはアロケータの責任です。これは、フリー ストアからでもスタック上でも自由に行うことができます。

ほとんどの実装では、通常、pimplイディオムを使用vectorして、フリー ストア上の実際のメモリを指すオブジェクト内にポインターを格納します。

数え切れないほどのデバッグとステップ実行にもかかわらず、関数の一部が非常に奇妙な動作をしていることに気付きました

vectorを適切に使用しているかどうかを確認することをお勧めします。各メンバー関数で得られる保証、含まれる型に対して満たす必要がある条件、および反復子が無効になる時期について、標準を調べてください。それは良いスタートになるはずです。

于 2012-06-07T01:02:00.713 に答える
3

std::vector自身の中に記憶を保存しません。ヒープからメモリを割り当てます (または、アロケータがメモリを取得する場所)。したがって、vector それ自体がスタック上にあるかどうかは関係ありません。

于 2012-06-07T00:58:54.423 に答える
1

ベクトル実装の 99.9% は、すべてのデータをヒープに格納していると言って差し支えありません。誰かがスタックの実装を作成したのかもしれませんが、あなたはおそらくそれを扱っていません。ランダムで断続的な障害が発生している場合は、ポインタ演算でチェックされないコーナーケースがより一般的です。いずれにせよ、コードを投稿しないとわかりません

于 2012-06-07T00:59:04.520 に答える