为什么它在第一种情况下起作用而在第二种情况下不起作用,因为在这两种情况下,赋值运算符右侧的类型都是 void *
class A {
public:
void *operator new(size_t size);
void operator delete(void *p);
};
void *A::operator new(size_t size) {
printf("Allocated %d bytes\n", size);
return malloc(size);
}
void A::operator delete(void *p) {
free(p);
}
int main()
{
A* p = new A(); // 1 Почему тут работает
void* v = p;
A* p1 = v; // 2 А тут нет
return 0;
}
你显然混淆了 new-expression
和重载函数
operator new这些是完全不同的、独立的实体,尽管相互关联。你的是从new-expression
operator new的实现中调用的原始内存分配函数。通过重载,您不会重载整个new-expression,而只是重载其中的一小部分。operator new一个示例新表达式算法如下所示:
operator new(或operator new[]为海量版本new [])分配原始内存。operator delete(对于海量版本:如果析构函数存在且不平凡,则预先销毁已经成功构造的元素)。您
operator new的仅在第 2 步中使用。new-expressionoperator new的其余功能不受您重载的影响。根据定义,New-expression 返回 out并且将始终准确返回 out 。new AA *A *请注意,在数组版本的情况下,
new []从new-expression返回的指针可能与从原始内存分配函数返回的指针的值不同operator new[]。一个表达式
new A();返回A *(而不是一个函数A::operator new),类似的代码是:如果
A::operator new直接调用该函数,则会出现与第二种情况相同的错误: