简单写我想问“使用智能指针的充分理由是什么?”
为前 std::unique_ptr
但是,我并不是在询问使用智能指针而不是常规(哑)指针的理由。我想每个人都知道,或者快速搜索可以找到原因。
我要问的是这两种情况的比较:
给定一个名为 MyObject
的类(或结构)用
std:queue<std::unique_ptr<MyObject>>queue;
而不是
std:queue<MyObject> queue;
(可以是任何容器,不一定是队列)
为什么有人应该使用选项 1 而不是选项 2?
最佳答案
这其实是个好问题。
我能想到的原因有几个:
std::queue<MyObject>
.一种选择是 unique_ptr
,另一个是reference_wrapper
std::vector::insert
或容器本身的移动。在这种情况下 std::unique_ptr<MyObject>
确保引用是有效的,无论容器用它做什么(ofc,只要 unique_ptr
还活着)。在以下示例中
Objects
您可以在队列中添加一堆对象。但是,其中两个对象可能很特殊,您可以随时访问这两个对象。struct MyObject { MyObject(int); };
struct Objects
{
std::queue<std::unique_ptr<MyObject>> all_objects_;
MyObject* special_object_ = nullptr;
MyObject* secondary_special_object_ = nullptr;
void AddObject(int i)
{
all_objects_.emplace(std::make_unique<MyObject>(i));
}
void AddSpecialObject(int i)
{
auto& emplaced = all_objects_.emplace(std::make_unique<MyObject>(i));
special_object_ = emplaced.get();
}
void AddSecondarySpecialObject(int i)
{
auto& emplaced = all_objects_.emplace(std::make_unique<MyObject>(i));
secondary_special_object_ = emplaced.get();
}
};
(*) 我在这里使用具有英文含义的“引用”,而不是 C++ 类型。任何引用对象的方式(例如,通过原始指针)
关于c++ - 在容器中使用智能指针的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61727550/