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运算符吗?
答案 0 :(得分:1)
好的,让我们试一试:
Ques1。谁能告诉我以下程序的输出及其工作原理?
在创建和销毁类operator new
的对象(及其派生类,除非它们声明自己的类)时,将使用成员operator delete
和Base
。
预计输出为:
尺寸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
将获得要分配的适当大小的内存。