質問

ダミーの" int"を使用できることを知っています。 operator ++ および operator-のパラメーターを使用して、これらの演算子の接尾辞バージョンをオーバーライドしますが、デストラクタで宣言できるダミーパラメーターについては漠然と思い出します。誰もがそれについて何か知っていますか?もしそうなら、そのダミーパラメータは何をしましたか?

これは私の古いTurbo C ++チュートリアル本にありました。私は10代の頃(つまり、ずっと前)に読んでいたので、完全に覚えていないかもしれません。それは標準化される前の非常に初期のC ++でもあったため、Turbo C ++固有のものであった可能性があります。

役に立ちましたか?

解決

あなたはおそらく、署名を持つ配置とnothrow形式の演算子削除を考えています:

void operator delete(void *, void *) throw();
void operator delete(void *, const std::nothrow_t&) throw();
void operator delete[](void *, void *) throw();
void operator delete[](void *, const std::nothrow_t&) throw();

これらは通常の操作中に呼び出されることはありませんが、 placement new は例外をスローします。コンパイラはすでにデッドオブジェクトのベースとメンバーでデストラクタを呼び出しており、新しい配置のために解放するメモリがないため、通常はそれらを定義する必要はありません。ただし、新しいプレースメントをオーバーロードしており、対応する演算子が必要な場合に存在できます。

2番目の引数は実際には使用されず、通常の署名を区別するだけです:

void operator delete(void *)

これらはoperator ++のように特別な仮引数ではありません。これらは、次のような追加の引数を使用してnewを呼び出す一般規則の単なるインスタンスです。

obj = new(x,y,z) Object(a,b,c) 

暗黙のコードを生成して、同じ追加の引数を演算子deleteに渡すコンストラクタエラーからクリーンアップします。これは(ほぼ)次のように機能します。

void *raw = operator new(sizeof(Object), x,y,z)
try {
    obj = new(raw) Object(a,b,c);
} catch(...) {
   operator delete(raw,x,y,z);
   throw;
}

他のヒント

覚えていないか、忘れてみてください。デストラクタにはパラメータや戻り値の型がないため、例外をスローするべきではありません。

おそらく新しい配置を考えていますか?

class MyClass { /* ... */ };

char * raw_mem = new char [sizeof (MyClass)];
pMyClass = new (raw_mem) MyClass;
// ...
pMyClass-->(~MyClass());
delete[] raw_mem;

あなたは狂っていない。前にデストラクタでintパラメータを見たことは間違いありません。 OpenVMSでHPのコンパイラを使用して、以下に示すサンプルプログラムをコンパイルしました。シンボルのリストには、intパラメーターを持つデストラクタが含まれています。これはコンパイラ固有のものだと推測できます。

$ create foo.cxx
class foo
{
 ~foo() {}
};

$ cxx foo.cxx

$ type [.CXX_REPOSITORY]cxx$demangler_db.
CX3

あなたは狂っていない。前にデストラクタでintパラメータを見たことは間違いありません。 OpenVMSでHPのコンパイラを使用して、以下に示すサンプルプログラムをコンパイルしました。シンボルのリストには、intパラメーターを持つデストラクタが含まれています。これはコンパイラ固有のものだと推測できます。

<*>ZN3FOOD1EV31GNTHJ foo::$complete$~foo() CX3

あなたは狂っていない。前にデストラクタでintパラメータを見たことは間違いありません。 OpenVMSでHPのコンパイラを使用して、以下に示すサンプルプログラムをコンパイルしました。シンボルのリストには、intパラメーターを持つデストラクタが含まれています。これはコンパイラ固有のものだと推測できます。

<*>ZN3FOOD2EV30KQI3A foo::$subobject$~foo() CX3

あなたは狂っていない。前にデストラクタでintパラメータを見たことは間違いありません。 OpenVMSでHPのコンパイラを使用して、以下に示すサンプルプログラムをコンパイルしました。シンボルのリストには、intパラメーターを持つデストラクタが含まれています。これはコンパイラ固有のものだと推測できます。

<*>ZN3FOOD9EV36HH9SB foo::~foo(int) CXXL

あなたは狂っていない。前にデストラクタでintパラメータを見たことは間違いありません。 OpenVMSでHPのコンパイラを使用して、以下に示すサンプルプログラムをコンパイルしました。シンボルのリストには、intパラメーターを持つデストラクタが含まれています。これはコンパイラ固有のものだと推測できます。

<*>ZDLPV void operator delete(void *)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top