私はあなたが与えているサンプルコードに問題が表示されません。
以下は私にとってうまくいきます。
[email protected] ~ $ cat leak_check.cpp && g++ leak_check.cpp && valgrind --leak-check=full ./a.out
#include <cstdlib>
class Base {
public:
static void * operator new (size_t size) {
if (size == 0) size = 1;
return malloc (size);
}
static void operator delete (void *ptr, size_t size) {
if (ptr == NULL) return;
free (ptr);
}
};
int main()
{
Base * p = (Base *) Base::operator new(sizeof(Base));
Base::operator delete((void*)p,sizeof(Base));
}
==4561== Memcheck, a memory error detector
==4561== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al.
==4561== Using Valgrind-3.5.0 and LibVEX; rerun with -h for copyright info
==4561== Command: ./a.out
==4561==
==4561==
==4561== HEAP SUMMARY:
==4561== in use at exit: 0 bytes in 0 blocks
==4561== total heap usage: 1 allocs, 1 frees, 1 bytes allocated
==4561==
==4561== All heap blocks were freed -- no leaks are possible
==4561==
==4561== For counts of detected and suppressed errors, rerun with: -v
==4561== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 17 from 6)
nullポインタは完全に正常です。
free
関数は、空間を割り当て解除するptr
によって指さ、つまり、さらに割当てのために利用可能にさせます。 ptr
がヌルポインタの場合、は何も起こりません。
したがってif (ptr == NULL) return;
を省略することができます。
あなたは二回、オブジェクトを削除するか、 'new'を呼び出してから取得していないポインタを経由してオブジェクトを削除しようとしていますか? –
補足として、 'free(NULL)'は安全であることが保証されているので、特別なケースは必要ありません。 –
hm ...私の悪い: 'if(size == 0)'を 'if(size = 0)'に置き換えて、コンストラクタだけでなくプライベートデータメンバを追加すると、コードは失敗します。私は 'size = 0'は発生してはならないバグですが、コンストラクタでこのクラスのプライベートデータメンバを初期化するときにのみコードが失敗することを知っています。 – Jaywalker