読者です 読者をやめる 読者になる 読者になる

少しだけ安全なnew/delete

昨日のsafe_deleteに対してご指摘があったの追記します。
mb2syncさんが
「これは二重deleteのバグを隠蔽するので非常にまずいと思いますよ」
とおっしゃられてふむふむ、と。


自分がテストで書いたコードのがいようはこんな事を意図していました。

void* operator new (size_t size, UserName user, Purpose purpose)
{

このnewは「誰が」「何の目的で」確保したメモリなのかをメモリブロックに保持しておきます。
(多人数で作業して自作のアロケータを用いる場合に使います。
このnewしたメモリをdeleteする際には「誰が」「何の目的で」確保されたメモリをdeleteするのかverifyできると便利です。


ですが、operator deleteは引数を受け付けません。
よって、

inline void safe_delete(T*& p, UserName user, Purpose purpose)
{
	check_delete( p, user, purpose);
        delete p;

のようなsafe_deleteがあると、メモリをチェックしてから消す事ができます。
勿論、NULLを消そうとしたらwarningを出すと良いでしょう。
仕様的に赦されていますが、意図したものかどうか知らせる事は有用でしょうから。


メモリにこのような情報を付記しておくと、
デバッグのときに現在確保しているメモリを表示する際に便利ですし、
パフォーマンス的に問題になるなら、デバッグ時だけ中身があるものに差し替えれば問題ありません。