Cにおける自殺関数とC++における自殺類

1145 ワード

今日glibc 2.7のメモリ割り当てコードを見て、ある関数のポインタが自己クリアしていることに気づきました.つまり、この関数ポインタは1回しか使用できません.具体的には指向関数malloc_hook_iniの関数ポインタ_malloc_hook.そこで自分でこのような関数の書き方を試してみました.
//  Function-Suicide 

int TestFunction(void);

int (*pTF)(int, int) = TestFunction;

int TestFunction()
{
    pTF = NULL;
    return 0;
}

そうです.pTF()は一度しか現れず、その後は使えなくなります.これは、1つの初期化関数が複数のスレッドによって呼び出されたり、複数回呼び出されたりすることを防止するために設定された保険だと思います.
もちろん本質的には不思議ではありませんが、関数ポインタpTFが呼び出されると、その指す関数TestFunctionの内部に入ります.このときpTFは役に立たず、好きなようにすることができます.--どの関数が好きなようにするかは制限されません.
簡単な(しかし、それほど楽しくないかもしれない)例として、手紙はPに1通の手紙をAからBに送らせ、手紙の内容の最初の文は「Pを乾かして、次の内容を見る」である.Pは関数ポインタであり、Aは呼び出し者関数であり、Bは主体関数である.
自殺類はもっと刺激的かもしれません:その構造関数にdelete thisを書きます...ClassName*p=ClassNameに似ています.の操作でpを野ポインタにすることができ、もちろんdelete pはエラーダイアログボックスをポップアップします.即効性が必要な場合は、ClassName;すぐにエラーが発生します.このようなクラスは、利用可能なオブジェクトインスタンスを生成することはできません.名実ともに自殺クラスですね.
class TestClass
{
public:
    TestClass();
protected:
private:
};


TestClass::TestClass()
{
    printf("This is construct function./n");
    delete this;
    printf("And I have suicided ");
}

……C言語はやはり博大で奥深いですね…