切片共享指针重新分配

时间:2018-04-18 05:08:52

标签: c++ shared-ptr

std::shared_ptr<A>重新分配给B类型的值是否始终是安全的,其中BA的子类?具体来说,在以下代码中:

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

时它们就消失了

1 个答案:

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