将std::shared_ptr<A>
重新分配给B
类型的值是否始终是安全的,其中B
是A
的子类?具体来说,在以下代码中:
class A {};
class B : public A {
int arr[1000];
};
int main() {
std::shared_ptr<A> pa = std::make_shared<A>();
*pa = B();
}
B
的大小比A
大得多,因此如果共享指针只为A
类型的对象分配了足够的内存,那么我们就会溢出。这是由图书馆妥善处理的吗?我在一个代码类似的大项目中遇到了问题,当我添加了一层间接(shared_ptr<shared_ptr<A>>
)
答案 0 :(得分:4)
您正在将A
对象分割为该作业中的shared_ptr
。您的示例中的分配与完全不涉及int main() {
A a;
a = B();
}
的情况没有什么不同:
pa
唯一的区别是你要分配shared_ptr
指向的对象而不是本地对象。
如果您确实希望将B
指向新的int main() {
std::shared_ptr<A> pa = std::make_shared<A>();
pa = std::make_shared<B>();
}
对象,则需要分配一个并分配给指针而不是指向的对象:
A
或者,如果您首先不需要int main() {
std::shared_ptr<A> pa = std::make_shared<B>();
}
对象:
{{1}}