切片共享指针重新分配

Slicing on shared pointer reassignment

重新分配 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>>)

您正在将 B 对象分割成该作业中的 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>();
}