【发布时间】:2015-05-20 07:44:54
【问题描述】:
我阅读了this 和this 的文章,令我惊讶的是,我发现该运算符具有void* 返回类型。
void* operator new (size_t size)
{
void *p=malloc(size);
if (p==0) // did malloc succeed?
throw std::bad_alloc(); // ANSI/ISO compliant behavior
return p;
}
但另一方面,我们知道,new 返回一个对象而不是 void 指针。怎么可能?
好的,让我们对上面的代码做一点改动
void* _new (size_t size)
{
void *p=malloc(size);
if (p==0) // did malloc succeed?
throw std::bad_alloc(); // ANSI/ISO compliant behavior
return p;
}
现在,编译器会阻止与转换其他类型的 void* 有关的警告吗?
【问题讨论】:
-
返回对象时“新”签名会是什么样子?
-
这些是自定义实现,可能是错误的?
-
@πάνταῥεῖ 是的。但是在这种情况下,您不能编写函数签名来返回指向任何类型的类的指针。所以这就是为什么使用 void* 并且转换是由编译器在没有警告的情况下完成的。
-
您将包含关键字
new的表达式误认为是operator new的调用。 -
新表达式具有特殊的语义。提供类型时,即返回指针的类型(尽管对于全局
operator new,返回类型为void*)。
标签: c++ object constructor malloc new-operator