gpt4 book ai didi

c++ - 将一个指针分配给另一个指针时执行的C++类型检查

转载 作者:行者123 更新时间:2023-12-02 10:36:30 25 4
gpt4 key购买 nike

我想知道编译器在下面进行类型检查的扩展

class Parent{
};

class Child : public Parent{
};

class Unrelated{
};

main(){
Parent* p = new Child() // OK. But type of p is still Parent* and not Child*
Unrelatead* u = new Child() // Not OK. Child* is not Unrelated*.
}

因此,在第一个分配中,p现在指向Child内的“Parent”对象,而第二个分配则完全不被允许,尽管最终p和u都将保留内存地址。

在这些分配过程中,编译器将执行哪些确切的检查?在编译的哪一部分执行这些检查?

最佳答案

第一次分配是可以的,因为编译器会将基类的所有内存排列在派生类的内存之前。
由于基类的所有字段仍将指向,因此您可以向上转换指针。

第二个分配不正确,因为Child不继承自Unrelated,因此它们的内存布局可能不同。
编译器会跟踪这些类层次结构。
这些检查仅在编译时进行。

请注意,向上转换指针可能很危险。
如果您的类不是虚拟的,则delete p将不会调用派生类的析构函数,从而导致潜在的内存泄漏。
如果决定使用upcast和delete指针,请确保对虚拟类执行此操作。

关于c++ - 将一个指针分配给另一个指针时执行的C++类型检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60062417/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com