3

私のコードでは、ファイル名と行番号を取得するためにnewand演算子をオーバーロードしました。delete私のコードでは、 と を使用mapしていstackます。マップから特定の値を消去すると、オーバーロードされdeleteた関数が呼び出されますが、他の関数ではなく、明示的なdeleteステートメントのみが関数にアクセスできるようにします。どうやってやるの?

4

2 に答える 2

3

自分の削除だけでオーバーロードを呼び出したい場合は、削除演算子をオーバーロードしませんが、代わりに、元の削除を呼び出す DeleteMyObject のようなカスタム メソッドを作成し、この関数を呼び出してすべての削除をこのマクロに置き換えるマクロを作成します。 .

お気に入り

#define DELETE_MY_OBJECT(obj) DeleteMyObject(obj, __FILE__, __LINE__)

メソッドは次のようになります

void DeleteMyObject(void* obj, char* file, char* line)
{
    // Log delete
    ...

    delete obj;
}

次に、コードで

MyObj* obj = ...
...
DELETE_MY_OBJECT(obj);
于 2010-09-08T13:13:38.920 に答える
1

map「明示的」のほとんどの定義では、フードの下で明示的に呼び出しています。これが、削除演算子が呼び出される理由stack ですdelete yourObjectこれらの削除は、コード内の削除と同様に正当です。

ところで、ファイル名と行番号はどうやって取得するのですか? それに注意してください__FILE____LINE__おそらく機能しません。これらは、見つかった行番号のファイル名と行番号を返します。つまり、 callerdeleteの場所ではなく、メソッドの場所を取得します。

「明示的な」削除のみをログに記録し、その場所を追跡するという目的の動作を得るには、ログに記録する削除をマクロ呼び出しに置き換える必要があります。その場合、オーバーライドする必要はありませんdelete。例えば:

#define DELETE(p) \
    do { \
        std::cout << __FILE__ << ":" << __LINE__ << ": " << p << std::endl; \
        delete p; \
    }
于 2010-09-08T13:13:08.340 に答える