いいえ。
class A
{
public:
A(){printf("A\n");}
~A(){}
static void* operator new(size_t t){
printf("A new\n");
::operator new(t);
}
static void operator delete(void* t){
printf("A delete\n");
::operator delete(t);
}
void check_B(){
b = new B();
::operator delete(b);
}
class B{
public:
B(){}
};
B* b;
};
class C : public A {
};
テスト:
int main(void)
{
A* a = new A;
printf("\ncheck ------\n");
a->check_B();
printf("\ncheck ------\n");
delete a;
C* c = new C;
A* cc = new C;
delete c;
delete cc;
return 0;
}
出力:
あ
新しいA
小切手 - - -
小切手 - - -
削除
新しい
あ
新しい
あ
削除
削除
RUN SUCCESSFUL (合計時間: 64ms)
valgrind:
==9318==
==9318== HEAP SUMMARY:
==9318== in use at exit: 0 bytes in 0 blocks
==9318== total heap usage: 4 allocs, 4 frees, 25 bytes allocated
==9318==
==9318== All heap blocks were freed -- no leaks are possible
==9318==
==9318== For counts of detected and suppressed errors, rerun with: -v
==9318== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2)
new A[]
オーバーロードしない限り、呼び出されることさえありませんoperator new[]()
。それに応じて、ネストされたクラスに対してそれらをオーバーロードする必要がありますA::B
。ただし、ご覧のとおり、A から派生したクラスに対して呼び出されます。
テスト、テスト、テスト。テストを行うことは、テストを行わないよりも常に優れています。作者:私。