关于嵌套类的operator new重载决策

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还是全局默认值?

2个回答

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

一个新的A

检查 ------

检查 ------

A删除

A新建

A

一个新的A

A

A删除

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派生的类。
测试,测试,测试。做测试总比不做测试好。作者:我。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接