重载Opertor新?

时间:2016-01-18 04:59:07

标签: c++ polymorphism operator-overloading new-operator delete-operator

Ques1。谁能告诉我以下程序的输出及其工作原理?

#include <iostream>
#include <malloc.h>
#include <vector>

using namespace std;

class Base
{
public:
void* operator new(size_t size)
{
    void *storage = malloc(size);
    if(NULL == storage) {
        throw "allocation fail : no free memory";
    }
    cout << "size " << size << endl;
    return storage;
    cout << "delete\n";
}
    void operator delete(void* p)
    {
        cout << "delete\n";
        free(p);
    }
private:
    int m_data;
};


class Derived : public Base
{
private:
    int m_derived_data;
    vector<int> z, y, x, w;
};


int main()
{
    Base* b = new Base;
    delete b;

    Derived* d = new Derived;
    delete d;
    return 0;
}

Ques2。如果我写Base * bp = new Derived;在那种情况下会发生什么?

Ques3。 New运算符会自动调用构造函数,那么在重载new运算符时如何调用构造函数?

Ques4。有必要在类中重载new和delete运算符吗?

1 个答案:

答案 0 :(得分:1)

好的,让我们试一试:

  

Ques1。谁能告诉我以下程序的输出及其工作原理?

在创建和销毁类operator new的对象(及其派生类,除非它们声明自己的类)时,将使用成员operator deleteBase

预计输出为:

尺寸4
删除
大小128 删除

或接近它的东西(Derived的大小为128)。

  

Ques2。如果我写Base * bp = new Derived;在那种情况下会发生什么?

它会起作用。 size的{​​{1}}参数将获得operator new的正确大小。

但是,像往常一样,如果您尝试在Derived没有虚拟析构函数的情况下通过指向Derived的指针删除Base,则会遇到麻烦。< / p>

  

Ques3。 New运算符会自动调用构造函数,那么在重载new运算符时如何调用构造函数?

这是调用构造函数的new-expression Base。这与new Derived不同,即使名称非常相似。

编译器将添加代码来调用正确的构造函数,您不必这样做。

  

Ques4。是否有必要在类中重载new和delete运算符?

没有。 operator new将获得要分配的适当大小的内存。