对共享指针重新分配进行切片
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>();
}
相关文章:
- 将数组的地址分配给变量并删除
- vector.resize()中的分配错误
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- Win32编译器选项和内存分配
- 函数中堆分配的效果与缺少堆分配的情况
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 获取字符串的长度并将其分配给数组
- 将地址分配给本地指针后,公共对象的变量将消失
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 我在二维向量中是否正确分配了内存
- 正在尝试重载二进制搜索树分配运算符
- GlobalAlloc而不是其他分配方法
- 自定义先决条件对移动分配运算符有效吗
- 我可以重新分配/覆盖std::字符串吗
- 在c++中使用动态分配的问题
- 当一个新对象被分配到它的地址时,对象是否必须被销毁
- 对共享指针重新分配进行切片
- 如何在c++中对向量进行切片并分配给它自己