私は例外でメモリの割り当てを解除していない以下のようなスマートポインタの実装を持っています..
template <class T>
class SMARTPOINTER
{
public:
SMARTPOINTER(T* pointee) : SMART_POINTEE(pointee) {
cout <<"\n Inside class SMARTPOINTER CONSTURCTOR \n";
}
~SMARTPOINTER() {
cout <<"\n Inside class SMARTPOINTER DESTRUCTOR \n";
delete SMART_POINTEE;
}
T& operator*() const
{
cout <<"\n Inside class SMARTPOINTER operator* \n";
return *SMART_POINTEE;
}
T* operator->() const
{
cout <<"\n Inside class SMARTPOINTER operator->() \n";
return SMART_POINTEE;
}
private:
T* SMART_POINTEE;
};
class Widget
{
public:
Widget() {
cout <<"\n Inside Widget CONSTRUCTOR \n";
}
void Fun() {
cout <<"\n Inside Widget::Fun() \n";
}
~Widget() {
cout <<"\n Inside Widget DESTRUCTOR \n";
}
};
class THROWME{
};
int main() {
SMARTPOINTER<Widget> sp(new Widget);
sp->Fun();
throw new THROWME;
(*sp).Fun();
return 0 ;
}
出力が
Inside Widget CONSTRUCTOR
Inside class SMARTPOINTER CONSTURCTOR
Inside class SMARTPOINTER operator->()
Inside Widget::Fun()
uncaught exception of type THROWME*
Aborted.
私の知る限り、スマートポインターはそのような場合に役立つはずです!! smart pointer を介して呼び出される Widget の破壊が見つかりません。
したがって、ここでいくつかの実装が欠落しているに違いありません。
コメントを読んだ後に編集
try catch で結果が得られました。しかし、その正しいアプローチがコードで変更されるかどうかはまだわかりません
int main() {
try {
SMARTPOINTER<Widget> sp(new Widget);
sp->Fun();
THROWME tm;
throw tm;
(*sp).Fun();
}
catch(...) {
cout <<"\n **SOME EXCEPTION CAUGHT** \n";
}
return 0 ;
}
結果
Inside Widget CONSTRUCTOR
Inside class SMARTPOINTER CONSTURCTOR
Inside class SMARTPOINTER operator->()
Inside Widget::Fun()
Inside class SMARTPOINTER DESTRUCTOR
Inside Widget DESTRUCTOR
**SOME EXCEPTION CAUGHT**