使用哪种(自动)指针?

b.b*_*old 6 c++ pointers auto-ptr

我遇到了几个问题,其答案表明使用T*绝不是最好的主意.

虽然我已经大量使用RIIC,但我的代码中有一个特殊点,我使用T*.阅读几个自动指针,我找不到一个我会说我有使用它的明显优势.

我的情景:

class MyClass
{

  ...
  // This map is huge and only used by MyClass and 
  // and several objects that are only used by MyClass as well.
  HashMap<string, Id> _hugeIdMap;
  ...
  void doSomething()
  {
    MyMapper mapper;
    // Here is what I pass. The reason I can't pass a const-ref is
    // that the mapper may possibly assign new IDs for keys not yet in the map. 
    mapper.setIdMap(&_hugeIdMap);
    mapper.map(...);
  }
}
Run Code Online (Sandbox Code Playgroud)

MyMapper现在有一个HashMap<...>*成员,根据对无关问题的问题的高度投票答案 - 从来不是一个好主意(在实例之前,映射器将超出范围MyClass,因此我不认为这是一个太大的问题.有没有new映射器中没有delete将需要).

那么这个特定用例中最好的选择是什么?

Sve*_*ven 8

我个人认为原始指针(或引用)在这里没问题.智能指针涉及管理指向的对象的生命周期,并且在这种情况下MyMapper不管理该对象的生命周期MyClass.您也不应该有一个指向未动态分配的对象的智能指针(在这种情况下哈希映射不是这样).

就个人而言,我会使用以下内容:

class MyMapper
{
public:
    MyMapper(HashMap<string, Id> &map)
        : _map(map)
    {
    }
private:
    HashMap<string, Id> &_map
};
Run Code Online (Sandbox Code Playgroud)

请注意,这将阻止MyMapper具有赋值运算符,并且只有在构造函数中传递HashMap可接受时它才能工作; 如果这是一个问题,我会使该成员成为一个指针(虽然我仍然将该参数作为参考传递,并_map(&map)在初始化列表中执行).

如果MyMapper使用哈希映射的其他类或其他任何类都可以使用MyClass,那么你必须开始考虑智能指针.在那种情况下,我可能会建议std::shared_ptr,但你必须在任何地方使用它:_hugeIdMap必须是shared_ptr动态分配的值,而不是常规的非指针字段.


更新:

既然你说由于项目的编码标准,使用引用是不可接受的,我建议只是坚持使用原始指针,原因如上所述.