0

誰かがこのパターンに関する質問を投稿しましたが、質問の解決策が頭に浮かびませんでしたので、私が持っているクエリを投稿して...

上記の例で、すべてのインスタンスが s_prototypes 変数によって初期化され、次にそのオブジェクトが clone メソッドで新しいオブジェクトに置き換えられた場合、既存のオブジェクトはどうなりますか?? それはメモリリークを作成しますか??

上記の例から私が理解している限り、2つのステートメントが私を混乱させています

class Stooge {
public:
   virtual Stooge* clone() = 0;
   virtual void slap_stick() = 0;
};

class Factory {
public:
   static Stooge* make_stooge( int choice );
private:
   static Stooge* s_prototypes[4];
};

int main() {
   vector roles;
   int             choice;

   while (true) {
      cout << "Larry(1) Moe(2) Curly(3) Go(0): ";
      cin >> choice;
      if (choice == 0)
         break;
      roles.push_back(
         Factory::make_stooge( choice ) );
   }

   for (int i=0; i < roles.size(); ++i)
      roles[i]->slap_stick();
   for (int i=0; i < roles.size(); ++i)
      delete roles[i];
}

class Larry : public Stooge {
public:
   Stooge*   clone() { return new Larry; }
   void slap_stick() {
      cout << "Larry: poke eyes\n"; }
};
class Moe : public Stooge {
public:
   Stooge*   clone() { return new Moe; }
   void slap_stick() {
      cout << "Moe: slap head\n"; }
};
class Curly : public Stooge {
public:
   Stooge*   clone() { return new Curly; }
   void slap_stick() {
      cout << "Curly: suffer abuse\n"; }
};

Stooge* Factory::s_prototypes[] = {
   0, new Larry, new Moe, new Curly
};
Stooge* Factory::make_stooge( int choice ) {
   return s_prototypes[choice]->clone();
}

Output
Larry(1) Moe(2) Curly(3) Go(0): 2
Larry(1) Moe(2) Curly(3) Go(0): 1
Larry(1) Moe(2) Curly(3) Go(0): 3
Larry(1) Moe(2) Curly(3) Go(0): 0
Moe: slap head
Larry: poke eyes
Curly: suffer abuse

ただし、make_stooge メソッドで clone メソッドを呼び出すと、新しいオブジェクトが返されます。それが新しいオブジェクトを返し、それを既存のオブジェクトに置き換えると、既存のオブジェクトがここでメモリ リークを引き起こします (new 演算子は完全に別のオブジェクトを作成し、ここでは既存のオブジェクトを返さないため)。 ....

このことは、この例で私を混乱させています....

4

2 に答える 2