1

私は現在、メモリが非常に少ない(4MB)デバイスで作業しており、std::setを必要とするプログラムのコンポーネントがあります。このセットをstd::stringの使用からconstcharポインターの使用に移行したいのですが、std :: setで使用すると、定数文字ポインターにメモリーがどのように割り当てられるのか疑問に思いました。

std :: setへの各エントリに割り当てられたメモリは、ポインタがセットから削除されたときに解放されますか(.clear()を使用するか、スコープ外になります)、または文字列リテラルは、プログラムの実行?

ご助力ありがとうございます。:)

4

2 に答える 2

1

要するに、特別なことは何も起こりません。

メモリへのポインタを含む構造体を削除すると、ポインタ自体が使用していたメモリのみが解放されます。ポイント先のメモリには何も起こりません。

もちろん、明示的にfree/deleteを呼び出す場合を除きます。文字列リテラルの場合、これは良い考えではありません!

于 2011-02-19T23:55:41.863 に答える
0

STL コンテナーは、コンテナーがクリーンアップされるときに、コンテナーに含まれる要素の既定のデストラクタを常に呼び出します。生の「char *」ポインターを保持するセットの場合、これは何もせず、メモリがリークします。ip この種のメモリを自分でクリーニングする責任があります。

このため、生のポインターを STL コンテナーに格納することは一般的に悪い習慣と見なされています。

生の C 文字列を含む STL セットを実際に使用する必要がある場合は問題ありませんが、自分でメモリを再利用する必要があることに注意してください。また、格納された文字列がポインタではなく値で比較されるように、セットにカスタム コンパレータを提供する必要があります ('char *' のデフォルトの順序付けでは、文字列ではなくポインタのみが比較されます)。

于 2011-02-19T23:58:51.567 に答える