2013-08-26 26 views
3

如果我重載操作newdelete一類具有一個嵌套類:重載解析關於嵌套類

class A 
{ 
public: 
    static void* operator new(size_t); 
    static void operator delete(void*); 

    class B; 
} 

會爲A::B對象中A::B對象和分配的情況下,分配使用重載A::newA::delete或全球默認?

回答

3

首先,機會非常高,你不需要超載newdelete,並應避免這樣做。

由此可見,重載運營商將申請A,而不是A::B。如果你想讓B超載的話,你需要在類B中超載。

有關如何重載newdelete一個例子:http://www.cprogramming.com/tutorial/operator_new.html

1

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

檢查------

檢查------

一個刪除

一個

一新

一個

一個刪除

一個刪除

成功運行(總時間: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派生的類。

測試,測試,測試。測試總是比不測試更好。作者:我。