簡體   English   中英

關於嵌套類的operator new的重載決策

[英]Overload resolution of operator new regarding nested classes

如果我為具有嵌套類的類重載operator newdelete

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

    class B;
}

將為實例分配A::B內的對象和分配A::B對象使用重載的A::newA::delete或全局默認值?

首先,很有可能你不需要重載new也不需要delete並且應該避免這樣做。

Baring that,重載的運算符將應用於A類,而不是A::B類。 如果你想讓B與重載運算符一起使用,你也需要在B類中重載它們。

有關如何重載newdelete的示例: http//www.cprogramming.com/tutorial/operator_new.html

沒有。

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)

除非你重載operator new[]() ,否則它甚至不會被稱為new A[] 您需要相應地為嵌套類A::B重載它們。 但是正如我們所看到的那樣,它們將被調用來自A的類。

測試,測試,測試。 測試總是優於不測試。 作者:我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM