切片共享指针重新分配
Slicing on shared pointer reassignment
重新分配 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>>
)
您正在将 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>();
}
重新分配 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>>
)
您正在将 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>();
}