誰かがこのパターンに関する質問を投稿しましたが、質問の解決策が頭に浮かびませんでしたので、私が持っているクエリを投稿して...
上記の例で、すべてのインスタンスが 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 演算子は完全に別のオブジェクトを作成し、ここでは既存のオブジェクトを返さないため)。 ....
このことは、この例で私を混乱させています....