【发布时间】:2013-08-27 13:19:02
【问题描述】:
假设我有这个示例代码:
class A
{
public:
static void* operator new(size_t sz);
private:
int xA;
float yA;
};
class B : public A
{
private:
int xB;
float yB;
};
void* A::operator new(size_t sz)
{
void* ptr = (void*)new B();
return ptr;
}
int main()
{
B* b = (B*) new A();
// Use b ..
delete b;
return 0;
}
这里将按顺序调用构造函数(在 VS2012 中测试):
- 构造函数
- B 构造函数
- 构造函数
前两个构造函数调用是因为重载的 operator new 函数中的new B()。
但随后将在函数返回的指针上再次调用 A 构造函数,因为重载的 operator new 应该返回指向空闲内存的指针(不创建对象),因此再次调用构造函数。
如果我在此示例中使用指针 b,这是未定义的行为吗?
【问题讨论】:
-
你应该返回原始内存。运算符 new 和 new 表达式(也将调用 ctor)之间存在差异
-
为
A重载new和delete运算符来创建/销毁B对象真是太可怕了! -
这里出了点问题。如发布的那样,代码具有无限递归。
B从A继承operator new,所以A::operator new中的new B()表达式调用A::operator new。
标签: c++ pointers constructor new-operator