0

プロジェクトのコードの一部を最適化しようとしています。表示するコンテキストがいくつかあります。

Class Basic
{
  type* _shareResource;
  virtual Basic(){};
  virtual ~Basic(){};
  virtual void initialResource() = 0;
  virtual void deleteResource() = 0;
  virtual void ownmethod() = 0;
  static Basic* createChild(int condition);
}
Basic* Basic::createChild(int condtion)
{
   Basic* pointer;
   if (condition ==  1)
       pointer = new ChildA();
   else 
       pointer = new ChildB();  
   return pointer; 
}


Class ChildA::public Basic
{
  void initialResource(){ allocate memory for _shareResource;}
  void deleteResource(){ delete _shareResource; _shareResource = NULL;}
  ChildA(){ initialResource(); }
  ~ChildA(){ deleteResource(); }
  virtual ownmethod() {// child A method}

}

Class ChildB::public ChildA
{
  void initialResource(){ allocate memory for _shareResource;}
  void deleteResource(){ delete _shareResource; _shareResource = NULL;}
  ChildB(){ initialResource(); }
  ~ChildB(){ deleteResource(); }
  virtual ownmethod(){// child B method}
}

したがって、クライアントとして Basic::createChild() を使用する場合: Basic* aPointer = CreateChild(1); // ある程度使用した後、クライアントはこのポンターを削除する必要があります delete aPointer;

ただし、RALL は、クライアントからの助けなしに基本的な削除自体を必要とします。だから私はコードを変更しようとしています。私がしたことは次のとおりです。

boost::share_ptr<Basic> Basic::createChild(int condtion)
{
   boost::share_ptr<Basic> pointer;
   if (condition ==  1)
       pointer = boost::share_ptr<ChildA>(new ChildA());
   else 
       pointer = boost::share_ptr<ChildA>(new ChildB());
   return pointer   
}

しかし、メモリリークとしてコアダンプを取得したため、子クラスの deleteResource() から確認しましたが、原因がわかりません。

コア ダンプについて説明したり、RALL の原則に従うためのより良い解決策を提供したりできますか? どうもありがとう。(私の最適化ではあまり多くのクライアント コードを変更しないようにするため、createChild を静的メソッドとして保持することを好みます)

4

2 に答える 2

2

なぜそんなに複雑なの!?

class Shared
{
   protected:
   struct Implementation
   {
       virtual ~Implementation() {}
   };

   protected:
   Shared(Implementation* p)
   : m_self(p)
   {}

   private:
   std/boost::shared_ptr<Implementation> m_self;
}

また、Shared::Implementation から派生したネストされたクラスを持つクラスを派生させます。

ただし、 std/boost::shared_ptr< SomeClass > を渡すこともできます

于 2013-12-16T21:31:17.973 に答える