item28 in More Effective C++を読んでいるときに質問に遭遇しました。この項目では、作成者は、メンバー テンプレートをに変換できるSmartPtr
ように使用できることを示しています。
次のコードは本と同じではありませんが、同じ効果があります。 SmartPtr<Cassette>
SmartPtr<MusicProduct>
#include <iostream>
class Base {};
class Derived : public Base {};
template<typename T>
class smart {
public:
smart(T* ptr)
: ptr(ptr)
{}
template<typename U>
operator smart<U>()
{
return smart<U>(ptr);
}
~smart()
{
delete ptr;
}
private:
T* ptr;
};
void test(const smart<Base>& ) {}
int main()
{
smart<Derived> sd(new Derived);
test(sd);
return 0;
}
実際、コンパイルエラーなしでコンパイルできます。しかし、実行可能ファイルを実行すると、コア ダンプが発生しました。sd
これは、変換演算子のメンバー関数が、同じ ptr へのポインター(その型は)を持つ一時的なスマートを作成するためだと思いますsmart<Derived>
。したがって、delete ディレクティブは 2 回動作します。さらに、test を呼び出した後は、 inが既に削除されているsd
ため、これ以上使用することはできません。
今私の質問は次のとおりです。 ptr
sd
- 私の考えは正しいですか?または、私のコードは本の元のコードと同じではありませんか?
- 私の考えが正しければ、これを行う方法はありますか?
どうもありがとうございました。