インスタンスが一緒に作成および削除される2つのクラスを作成しようとしています。1つのクラスは他のクラスのベースです。
class Interface;
class MyClass
{
friend class Interface;
private:
MyClass() {}
public:
static MyClass *NewInstance();
Interface *ControlPanel;
};
class Interface : public MyClass
{
friend class MyClass;
private:
Interface() {}
public:
void Control1() {cout << "control1" << endl;}
void Control2() {cout << "control2" << endl;}
void Control3() {cout << "control3" << endl;}
};
インスタンスを作成および削除することになっている2つのメンバー関数は次のとおりです。
MyClass *MyClass::NewInstance()
{
MyClass *inst = new MyClass;
inst->ControlPanel = new Interface;
return inst;
}
void DeleteMyClassInstance(MyClass *inst)
{
delete inst->ControlPanel;
inst->ControlPanel = 0;
delete inst;
inst = 0;
}
インスタンス作成プロセスを、インスタンスを作成する基本クラス()の関数を使用してリンクすることに成功しましたNewInstance()
。ただし、削除関数(DeleteMyClassInstance()
)は機能しません(つまり、関数を呼び出した後でも両方inst1
を使用できます)。inst1->ControlPanel
int main()
{
MyClass *inst1 = MyClass::NewInstance();
inst1->ControlPanel->Control1();
DeleteMyClassInstance(inst1);
inst1->ControlPanel->Control1();
return 0;
}
しかし、main関数内に削除コードを配置すると、完全に機能します(inst1->ControlPanel->Control1()
deleteステートメントの後に続くステートメントは機能しません。それが私が望むものです)。
int main()
{
MyClass *inst1 = MyClass::NewInstance();
inst1->ControlPanel->Control1();
delete inst->ControlPanel;
inst->ControlPanel = 0;
delete inst;
inst = 0;
inst1->ControlPanel->Control1();
return 0;
}
私の質問は、deleteステートメントをmain関数内に直接配置しても、別の関数内に配置してmainで使用しても機能しないのはなぜですか?DeleteMyClassInstance()
関数内のコードがコンパイラーによって無視されるのはなぜですか?