无法从引用创建共享指针
Fail to make a shared pointer from a reference
这里的主要问题是:我可以使用引用创建共享指针吗?
在下面的代码中,类AnimalList
实现了一个容器,该容器保存指向派生自Animal
的所有类型的共享指针向量。为了将项推送到容器中,类AnimalList
有两种方法,一种允许引用,另一种接受共享指针。
显然,通过引用创建共享指针无法提供所需的结果。请参阅第 [5] 行处的分段错误。
我知道有人建议避免从引用中创建共享指针。但我不太明白为什么以这种方式通过引用创建共享指针会失败。如果这可能的话,正确的方法应该是什么?
#include <iostream>
#include <string>
#include <vector>
#include <memory>
class Animal {
private:
std::string type = "Animal";
public:
Animal() {}
virtual std::string get_type() { return type; }
};
class Bird : public Animal {
private:
std::string type = "Bird";
public:
Bird() {}
std::string get_type() { return type; }
};
class Mammal : public Animal {
private:
std::string type = "Mammal";
public:
Mammal() {}
std::string get_type() { return type; }
};
class AnimalList {
public:
std::vector<std::shared_ptr<Animal> > list; // [1]
void push(Animal& ref) { // [2]
list.push_back(std::make_shared<Animal>(ref));
}
void push(std::shared_ptr<Animal> shared_ptr) {
list.push_back(shared_ptr);
}
};
int main() {
Bird magpie;
std::shared_ptr<Mammal> dog_ptr (new Mammal());
AnimalList list;
list.push(magpie); // [3]
list.push(dog_ptr); // [4]
//std::cout << std::dynamic_pointer_cast<Bird>(list.list[0])->get_type() << "n"; //[5] Segmentation fault
std::cout << std::dynamic_pointer_cast<Mammal>(list.list[1])->get_type() << "n"; //[6] Mammal
return 0;
}
如果你引用堆栈中的一个对象并从中创建一个共享指针,你告诉系统"嘿,我希望两个所有者控制它。这意味着有两件事会试图杀死物体,这是不行的。每个对象只能有一个所有者。如果你想要一个共享指针,则必须以没有其他人拥有它的方式构造对象。
您需要传递共享指针、创建副本或以其他方式动态创建对象。然后只有一个东西拥有对象并处理它的销毁。
给定std::make_shared<Animal>(ref)
,你正在创建一个指向Animal
的std::shared_ptr
,它是从ref
复制构造的。然后动态强制转换失败,std::dynamic_pointer_cast<Bird>(list.list[0])
返回空指针。
您需要从一开始就创建指向Bird
的std::shared_ptr
。
void push(Bird& ref) { // [2]
list.push_back(std::make_shared<Bird>(ref));
}
顺便说一句:Animal
的析构函数应该标记为virtual
。
相关文章:
- 如何从具有移动语义的类对象中生成共享指针
- 使用共享指针的函数调用,其对象应为 const
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 如何访问由共享指针保存的类方法?
- 从矢量或地图中删除共享指针
- 使用共享指针时,从共享指针本身释放内存的机制是什么
- 使用共享指针实现复制 c'tor?
- 共享指针继承,而不先显式强制转换
- 如何检查类中共享指针的有效性?
- std::排序在共享指针的向量上
- 将相同共享指针的副本存储在不同的向量中是否是一种好的做法?
- 嵌套类、继承和C++中的共享指针
- 制作一对共享指针并推送一个向量
- 如何将共享指针用作函数参数
- 是否可以/希望创建不可复制的共享指针模拟(以启用weak_ptr跟踪/借用类型语义)?
- 尝试通过共享指针使用变量时读取访问冲突
- 如何将元素插入到标准::地图的共享指针中?
- 共享指针生存期
- 初始化可变数据结构中的共享指针向量
- 阻止在返回时复制共享指针