3

new演算子をオーバーロードdeleteし、ネストされたクラスを持つクラスの場合:

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

    class B;
}

オブジェクトのインスタンスの割り当てとA::Bオブジェクト内の割り当てA::Bは、オーバーロードA::newされA::deleteたデフォルトまたはグローバルなデフォルトを使用しますか?

4

2 に答える 2

3

まず第一に、オーバーロードする必要がない可能性が非常に高く、オーバーロードを避けるべきではありnewません。delete

Aそれをむき出しにして、オーバーロードされた演算子は classではなくclass に適用されますA::B。B にオーバーロードされた演算子が必要な場合は、クラスBでもそれらをオーバーロードする必要があります。

newとをオーバーロードする方法の例delete: http://www.cprogramming.com/tutorial/operator_new.html

于 2013-08-26T20:52:13.350 に答える
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

小切手 - - -

小切手 - - -

削除

新しい

新しい

削除

削除

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 から派生したクラスに対して呼び出されます。

テスト、テスト、テスト。テストを行うことは、テストを行わないよりも常に優れています。作者:私。

于 2013-08-26T21:30:51.213 に答える