将重载的new返回的void *赋值给用户定义类型的指针时没有错误

时间:2015-08-29 12:15:48

标签: c++

我已经为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 ;
}

3 个答案:

答案 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