1

我有一个结构如下:

struct T_MY_TOY {
   uint32_t id;
   float data;
};

我想定义一个自定义地图。我的第一个实现是:

typedef std::map<uint32_t, T_MY_TOY*> T_MY_TOY_MAP;

T_MY_TOY*使用智能指针引用包装器代替智能指针是否正确?

typedef std::map<uint32_t, std::shared_ptr<T_MY_TOY> > T_MY_TOY_MAP;

或者:

typedef std::map<uint32_t, std::reference_wrapper<T_MY_TOY> > T_MY_TOY_MAP;

哪个是最好的解决方案?

4

2 回答 2

4

几乎总是,最好的选择是存储对象。

仅在有充分理由时才存储指针或引用:要么因为对象不属于容器,要么因为它们具有多种多态类型。

在第一种情况下,容器不拥有对象。如果您可以保证对象在容器中时不会被销毁,那么它可以存储原始指针。否则,您将需要通过存储shared_ptrweak_ptr.

在第二种情况下,容器确实拥有对象。单一所有权语义最好由unique_ptr; 尽管shared_ptr如果您需要共享所有权可能是必要的。

当您需要一个像对象而不是指针的类型时使用引用包装器(即不需要显式取消引用);它们通常与需要对象类型的模板一起使用。当您控制与元素交互的方式时,没有必要这样做;使用它们而不是原始指针只会通过隐藏间接而引起轻微的混乱。由于它们不管理对象的生命周期,它们只能用于可以使用原始指针的情况。

于 2013-08-16T15:16:14.070 回答
2

您的解决方案都不是最好的,最好的解决方案是按价值存储:

 typedef std::map<uint32_t, T_MY_TOY> T_MY_TOY_MAP;
于 2013-08-16T11:31:00.713 回答