对共享指针重新分配进行切片

Slicing on shared pointer reassignment

本文关键字:分配 切片 共享 指针 新分配      更新时间:2023-10-16
重新

分配一个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>();
}