我已经为new做了重载,我很震惊地看到当我为A *分配了一个void *时,我的Dev CPP编译器怎么没有给出任何错误。我想知道编译器是否在这里做了必要的事情,我是对的吗?提前谢谢。
class A {
public:
void* operator new(size_t size)
{
return malloc(size);
}
};
int main(int argc, char** argv) {
A* a = new A();
void* v = NULL;
return 0 ;
}
答案 0 :(得分:4)
# Setup for the tasks
while(True):
# Do the tasks
for i in range(5):
print "Next run in " + str(5-i) + " mins"
time.sleep(60)
很特别。重载new
用于从自定义位置提供存储空间。但这只是工作的一半:对象仍然需要在这个存储中构建,这是编译器的工作。
当你返回存储空间时,还没有构造对象,所以返回operator new
是有意义的。但是,void*
还有另一个编译器生成的步骤。
答案 1 :(得分:2)
operator new
必须返回void*
。如果您尝试返回int*
,则会出现编译错误。
我认为让您感到困惑的是void*
如果没有看似必需的演员而变成int*
。但问题是,这不是正常的转换,就像尝试在您自己的代码中执行void* v; int* i = v;
一样。这样的尝试确实会失败。 您自己的代码的规则与允许编译器的规则不同。
一个这样的编译器权限就是将void*
从您的运算符变为int*
(或任何T*
,即。)
如果您考虑一下,编译器在处理new
中的A* a = new A();
表达式时会在幕后做更多事情。例如,它还会创建一个"隐形"构造函数调用。
P.S。:Dev-C ++不是编译器,它是与旧版GCC捆绑在一起的IDE。我建议使用现代编译器。
答案 2 :(得分:-1)
正如Why does C++ require a cast for malloc() but C doesn't?中所回答的,从void *
到任何没有强制转换的指针类型的转换在C中有效,而在C ++中则无效,其中需要static_cast
。