2

このようなデータ構造に最も適しているのは、どのタイプのスマート ポインター (共有、スコープ) ですか...

構造 1:

//Class with cross-references to points p1, p2
class PointTopo
{
private:
    double x, y;
    PointTopo * p1;
    PointTopo * p2;

public:
    PointTopo(double xx, double yy): x(xx), y(yy) {this-> p1 = NULL; this->p2 = NULL;}
    ...

};

構造 2:

//Class  with cross references: topological model for Delaunay triangulation
class Edge
{
   private:
      Point * start; //Only 2D point without topo information
      Edge *next;
      Edge *previous;
      Edge *twin;
...
};

ベクトルを使用して Edge と PointTopo を保存したいと思います。

class PointsTopoList
{
   private:
      std::vector <PointTopo *> points;
   public:

      inline void push_back ( PointTopo *p ) { points.push_back ( p );}
      ~PointsTopoList() {clear();}
      void clear()
        {
           for ( TNodes2DList::iterator i_points= points.begin(); i_points!= points.end(); ++i_points)
            {
            if ( *i_points!= NULL )
            {
                delete *i_points;
                *i_points= NULL;
            }

             points.clear();
        }

}

しかし、デストラクタに問題があるので、参照カウントを使用するかどうかを検討しました。

int main()
{
   PointTopo *p1 = new PointTopo(0,0);
   PointTopo *p2 = new PointTopo(10,10);
   PointTopo *p3 = new PointTopo(20,20);
   PointTopo *p4 = new PointTopo(30,30);

   PointsTopoList tl1;
   tl1.push_back(p1);
   tl1.push_back(p2);
   tl1.push_back(p3);
   tl1.push_back(p4);

   PointsTopoList tl2;
   tl2.push_back(p1);  //P1 is stored in tl1 and tl2
   tl2.push_back(p2);  //P2 is stored in tl1 and tl2
}

ポイント p1、p2 は両方のリスト tl1、tl2 に格納されます。tl2 のデストラクタは例外を引き起こし、ポイント p1 と p2 は tl1 デストラクタを使用して既に削除されています。

この例は合成ではありません。nl2 が nl1 のサブセット、たとえば nl1 の凸包を表すと想像してください...

この問題は、参照カウントなしでは解決できないと思います...だから、スマートポインターを使用しようとしています...

ご助力ありがとうございます...

4

3 に答える 3

2

tl2 のデストラクタは例外を引き起こし、ポイント p1 と p2 は tl1 デストラクタを使用して既に削除されています。

deleteオブジェクトp1(およびp2) を 2 回試みています。これは UB を呼び出します。これは悪いことです。名前空間 (詳細については、コンパイラのドキュメントを参照してください) または Boost のshared_ptr両方で利用できる (参照カウント スマート ポインター) を試してください。std::tr1

もう 1 つは、オブジェクトをコピーすることです (現在行っているようにポインターをコピーするのではありません)。PointTopoそして、それにはオブジェクトの複製が必要でした。

unique_ptr(個人的には、メンバーEdgePointTopo孤立して使用する傾向があります。)

于 2010-09-01T16:17:32.053 に答える
2

shared_ptr<>同じオブジェクトへの複数のポインターの参照カウントと管理を行い、オブジェクトへの最後のポインターが破棄されるとオブジェクトを削除します。

scoped_ptr<>ポインターをスタック変数のように動作させ、ポインターがスコープ外になるとすぐに、ポイント先のオブジェクトを削除します。これは、ここで探している動作ではありません。

あなたのユースケースでは、によって提供される参照カウントshared_ptr<>はあなたが望むものです。

于 2010-09-01T16:18:26.217 に答える
1

あなたが必要とするのはboost::shared_ptrです

于 2010-09-01T16:16:37.350 に答える