私はツリーを構築しており、Node
2 つまたは 3 つの整数、ベクトル、およびポインターを含むクラスを持っています。ベクターはNode
、次のようにインスタンスを格納します -- 次のように命名Node
しA
ます。
class A {
public:
A(A *parent) :
_parent(parent) {
}
std::vector<INSTANCES_OF_A> v;
private:
A *_parent;
};
私は使用することがあります:
class A {
public:
A(A *parent) :
_parent(parent) {
}
std::vector<A *> v;
private:
A *_parent;
};
// Insertion
A a;
a.v.push_back(new A(&a));
または:
class A {
public:
A(A *parent) :
_parent(parent) {
}
std::vector<A> v;
private:
A *_parent;
};
// Insertion
A a(NULL);
a.v.push_back(A(&a));
最初のケースでは、インスタンス自体とは別に、への各ポインタに 4 ~ 8 バイトを余分に割り当てますA
。
2 番目のケースでは、これらの 4 ~ 8 バイトが保存されますが、次のシナリオが構成されます。
a.v.push_back(A(&a))
プッシュバック -- 動的に割り当てていると思います -- から構築されたインスタンスA(&a)
。- ベクターはこれらの要素を押し戻しますが、一時的な制限に達すると、ベクターは再割り当てされ、移動される可能性があります。
A
ベクトルを移動すると、A *_parent
メンバーの各インスタンスの構築中に構築されたアドレスの関連付けが変更されます。
拘束:
- 初期ベクトルの正確なサイズがわかりません。
- ベクトルの再割り当てが発生するたびにリンクを再処理/再構築すると、余分な処理が必要になります。
質問:
これらの 2 つの制限を考慮して、このダングリング ポインターの問題を回避する方法はありますか? または、この問題に対するより良いアプローチはありますか?