以下の問題はあまり一般的ではないため、オンラインで役立つものは見つかりません。
私はclass parent
、デフォルトのコンストラクタとデストラクタを持っている必要がありますが、これら2つのメンバーについて何も定義することは想定されていません。
破壊を制御する必要があります。ptr
参照されていない場合にのみ破壊する必要があります。これは、で制御さcounter
れsomeclass
ます。
class parent {
public:
someclass * ptr;
}
class child: public parent {
~child() { //<-- this line
cout<<"in ~child!"<<endl;
if(this->ptr == NULL) cout<<"ptr is NULL"<<endl;
this->ptr->delete_reference(); //<-- here ptr = NULL
}
someclass* get_ptr() {
return this->ptr;
}
}
class someclass {
void delete_reference() {
counter--;
if(counter == 0) delete this;
}
問題は、this line
親のデフォルトでデストラクタが呼び出さptr = NULL
れ、その結果、ptr
適切にデストラクタされないことです。
これらの制限付きで〜parentの呼び出しをスキップする方法はありますか?
また、継承を削除しようとし、parent
inのインスタンスを作成しましchild
たが、同じことが起こり、親のデストラクタが再度呼び出されます。
さらに、子供クラスがもっとあり、彼らがこの情報を共有する必要があるので、私は必要ptr
です。parent
ありがとうございました!
編集:
わかりました、私はここで何か間違っています...問題はptrがどのようにNULLになるかです。デストラクタ呼び出しの順序を混同している限り、問題はありませんthis line
。
void function() {
child ch1;
for(int i = 0; i<1; i++) {
cout<<iterating<<endl;
do_some_work(ch1);
}
if(ch1->get_ptr() != NULL) cout<<"ptr is OK"<<endl;
return;
//Here is the destructor ~child called (?)
}
int main() {
function();
}
上記の呼び出しは、私が使用する方法ですchild
。内部do_some_work
には、実際にはここで説明するのが難しい多くの作業があります。
ポイントは、do_some_work
終了後ptr
はOKです。次に、デストラクタが呼び出され、のptr
ように見えると思いますNULL
。
したがって、上記は次のように出力されます。
iterating
ptr is OK
in child
ptr is NULL
Segmentation fault
この編集の後に何か説明はありますか?
どうもありがとうございました!