これが私がやっていることです:
#include <iostream>
using namespace std;
class Test
{
public:
int i;
Test();
Test(int x);
~Test();
static void operator delete(void * t);
};
Test::Test() : i(1) { cout << "constructing" << endl; }
Test::Test(int x) : i(x) { cout << "constructing w/ arg" << endl; }
Test::~Test() { cout << "destructing" << endl; }
Test::operator delete(void *self)
{
cout << "deleting" << endl;
((Test *) t)->~Test(); // call destructor since it isnt called otherwise
::delete(t); // actually delete memory
}
template <typename T> // too lazy to figure out correct type
void callback(Test *t, T fn)
{
(fn)(t); // delete operator is implicitly static so this syntax is correct
}
int main()
{
Test *t = new Test();
callback(t, &Test::operator delete); // deletes t
}
operator delete
クラスで がオーバーロードされていない限り、前のスニペットはコンパイルに失敗することに気付きました。含まれている場合は、コンパイルして期待どおりに動作します (最初にコンストラクターが呼び出され、次にオーバーロードされた削除、次にデストラクタがそれぞれ 1 回だけ呼び出されます)。
グローバルな delete operator を渡すことを考えまし::operator delete
たが、それも機能しません (未解決のオーバーロードされた関数呼び出しが発生します)。アドレスをうまく取得しようとせずに呼び出すことができます。
の独自のオーバーロードを定義しなくても、私がやっていることは可能::operator delete
ですか?
基本的に、このようなものを使用する必要があるユースケースはありません。::operator delete
それは一般的な使用法ではなく、デストラクタを呼び出さないことを私は知っています....