1

嗨,我想问一个让我困惑的问题。

我有这样的课:

class A { 

private:
std::vector<Object*>* my_array_;

...

public
std::vector<Object*>& my_array(); // getter
void my_array(const std::vector<Object*>& other_array); // setter
};

根据您的经验,我想问您,以(可能)安全的方式实现 setter 和 getter 的正确方法是什么。

我想到的第一个解决方案如下。

首先,当我实现 setter 时,我应该: A)检查输入不是对我已经持有的数据结构的引用;B) 释放 my_array_ 指向的所有对象的内存 C) 复制 other_array 指向的每个对象并将其副本添加到 my_array_ D) 最后结束函数。

getter 可能会生成内部数组的副本,以防万一。

问题很多: - 这种策略是不是矫枉过正?- 真的能避免问题吗?- 有人真的使用它还是有更好的方法?

我试图寻找这个问题的答案,但没有发现什么特别关注这个问题。


使用智能指针是一个很好的答案,我感谢你们俩.. 看来我不能给多个“有用的答案”,所以我提前道歉。:-)

然而,从你的回答中提出了一个新的疑问。当我对对象使用包含 unique_ptr 的向量时,我将不得不定义一个深拷贝构造函数。鉴于现在我们正在使用智能指针,有没有比使用迭代器复制对象向量中的每个元素更好的方法?

4

2 回答 2

1

我认为您将指针 std::vector作为数据成员的事情过于复杂了;请记住,C++ 不是 Java(C++ 更基于“价值”而不是基于“引用”)。

除非有充分的理由使用指向 astd::vector作为数据成员的指针,否则我只会使用简单的std::vector“按值”存储。

现在,关于 中的Object*指针vector,您应该问自己:那些是观察指针还是那些拥有指针?

如果vector只是观察Objects (并且它们归其他人所有,例如对象池分配器或其他东西),您可以使用原始指针(即 simple Object*)。但是如果向量在 s 上有一些所有权语义Object,你应该使用shared_ptrorunique_ptr 智能指针。如果向量是实例的唯一所有者,使用; 否则,使用(它使用引用计数机制来管理对象生命周期)。Objectunique_ptrshared_ptr

class A 
{ 
public:
  // A vector which owns the pointed Objects
  typedef std::vector<std::shared_ptr<Object>> ObjectArray;

  // Getter
  const ObjectArray& MyArray() const
  {
      return m_myArray
  }

  // Setter 
  // (new C++11 move semantics pattern: pass by value and move from the value)
  void MyArray(ObjectArray otherArray)
  {
      m_myArray = std::move(otherArray);
  }

private:
  ObjectArray m_myArray;
};
于 2012-10-17T15:20:10.100 回答
1

我通常建议不要使用指向向量的指针作为成员,但从你的问题来看,它似乎在多个实例之间共享。

也就是说,我会选择:

class A { 
private:
   std::shared_ptr<std::vector<std::unique_ptr<Object> > > my_array_;

public
   std::shared_ptr<std::vector<std::unique_ptr<Object> > >  my_array(); // getter
   void my_array(std::shared_ptr<std::vector<std::unique_ptr<Object> > >  other_array); // setter
};

无需检查,没有内存管理问题。

如果内部Objects 也被共享,请使用 astd::shared_ptr而不是std::unique_ptr.

于 2012-10-17T14:48:00.357 回答