0

私は基本的に持っています

vector<Object> vec_; 

cpp クラスのクラス メンバーとして。特定のクラス関数で、このベクトルは次のように「オブジェクト」で満たされます。

vec_.push_back(Object());

後で、ベクター要素を繰り返し処理し、最適な要素へのポインターを保持します。次に、次のようにベクトルがクリアされます。

Object* o_ptr = &(vec_[0]);
for (unsigned int i = 1;  i < vec_.size(); i++) {
  if (o_ptr->getCost() > vec_[i].getCost()) {
  o_ptr = &(vec_[i]);
} 

vec_.clear();

ここで私の質問は次のとおりです。ベクトルから削除されたオブジェクトはどうなりますか? それらがベクターから取り除かれるとすぐに、その寿命は終わりますか? そして、ポインターも空のスペースを指していますか? そうでない場合、これらのオブジェクトの有効期間はいつ終了しますか?

よろしく scr

4

4 に答える 4

3

vector.clear()呼び出されると (またはvectorが破棄されると)、 に含まれるすべてのオブジェクトvectorが破棄され (この場合、それらは生のポインターではなくオブジェクトである)、o_ptrダングリング ポインターとして残ります。

要素のアドレス (または反復子) を にキャッシュするvectorことは、 を呼び出さなくても危険であることに注意してくださいclear()。たとえば、push_back()の内部再割り当てが発生しvector、キャッシュされたアドレス (または反復子) が無効になる可能性があります。

于 2012-10-16T13:57:52.910 に答える
1

オブジェクトの有効期間を追跡する最善の方法は、コンストラクターとデストラクターの両方に printf を追加することです。

class MyObject
{
public:
    MyObject()
    {
        printf("MyObject constructed, this=%p\n", this);
    }
    ~MyObject()
    {
        printf("MyObject destructed, this=%p\n", this);
    }
};
于 2012-10-16T14:00:35.953 に答える
1

ベクターから削除されたオブジェクトはどうなりますか?

それらは破壊されます。

それらがベクターから取り除かれるとすぐに、その寿命は終わりますか?

はい。

ポインタも空のスペースを指していますか?

はい、そうです。オブジェクトを保存する場合は、ベクトルをクリアする前にコピーを作成してください。

また、特定のベクトル操作では、ベクトルがクリアされていなくても、ポインターが何も指していないままになる可能性があることに注意することも重要です。具体的には、通常は再割り当てを伴うサイズ変更。ベクトル要素への参照は、インデックスを介していつでも取得できるため、通常はインデックスを使用して格納することをお勧めします (一方、ポインタは特定の操作の後に無効になる可能性があります)。

ベクトルに適用される添え字演算子は参照を返し、コピーは作成しません。

于 2012-10-16T14:02:05.093 に答える
1

オブジェクトはベクターによって所有されており、.clear()実際にそれらを削除します。

また、 に格納されているオブジェクトを指すのstd::vectorは少し危険です。新しい要素をベクターにプッシュすると、ある時点でベクターがより多くのメモリを割り当てる必要がある場合があります。これにより、以前のすべての要素がコピー コンストラクターを使用して別のアドレスにコピーされる可能性があります (したがって、ポインターが無効になります)。

std::vectorそのため、予約容量を超えてプッシュしないことがわかっている場合を除き、ポインターの代わりに整数インデックスを使用してください (これは を使用して保証できます.reserve())。

.size()(また、ベクトルの内部バッファー サイズを、格納されている実際の要素の数である と混同しないように注意してください)。

于 2012-10-16T14:03:04.973 に答える