当在堆中创建对象时,它(新)做两件事。
1:调用operator new
2:调用构造函数初始化obejct。
我正在尝试创建对象数组,例如4个对象,所以它调用构造函数和析构函数4次才有意义,但它只调用一次运算符new [] ??为什么?以下是我试图运行的代码。
#include <iostream>
using namespace std;
class test
{
public:
static void *operator new[] (size_t size)
{
cout<<"operaotor new called"<<endl;
return ::operator new[](size);
}
test()
{
cout<<"constructor called"<<endl;
}
~test()
{
cout<<"destructor called"<<endl;
}
};
int main()
{
test *k = new test[4];
delete []k;
}
答案 0 :(得分:6)
operator new[]
只在那里分配必要的空间,没有别的。当然,它只会这样做一次,因为其他任何东西都是无关的,并且不会得到连续的缓冲区。对于size
,您获得的new test[4]
参数应为4 * sizeof(test)
。
答案 1 :(得分:2)
构造函数和析构函数对数组中的每个项都调用一次,而new []只调用一次,因为你只创建了一个数组。