智能指针指向容器

时间:2014-02-07 08:13:02

标签: c++11 stl containers smart-pointers

通过引用发送stl容器时,它不是那么安全。 用智能指针包装stl容器以发送为函数参数是否有意义?

template <typename T>
void f(const std::unique_ptr<T> up) {
  ...
}

std::unique_ptr<std::vector<char>> array;
f(std::move(array));

UPD :好的,让我们缩小问题范围。 我正在制作一些课程的实例。我应该用容器构建它:

class MyClass {
  public: 
    MyClass(const std::vector<int>& ar) : m_ar(ar) {};
  private:
    std::vector<int> m_ar;
};

std::vector<int> tmp_ar;
tmp_ar.push_back(0);
tmp_ar.push_back(1);
tmp_ar.push_back(2);
MyClass mc(tmp_ar);

我不想在将容器发送到构造函数时复制容器,然后我使用对局部变量的引用。 这段代码中的某些东西让我感到紧张。

1 个答案:

答案 0 :(得分:2)

  

我不想在将容器发送到构造函数时复制容器,然后我使用对局部变量的引用。这段代码中的某些东西让我感到紧张。

代码是正确的,因为tmp_ar正在制作m_ar(ar)副本 mc没有引用本地变量{{ 1}}所以tmp_armc 之间没有生命依赖关系。如果对象存储对另一个对象的引用并且在另一个对象被破坏时尝试使用该引用,则会出现问题(请参阅dangling pointer,同样适用于引用)。

tmp_ar可能是std::move() d,以便在将tmp_ar作为构造函数参数传递后不再需要tmp_ar时避免复制:

class MyClass {
  public: 
    MyClass(std::vector<int> ar) : m_ar(std::move(ar)) {};
  private:
    std::vector<int> m_ar;
};

std::vector<int> tmp_ar {0, 1, 2};
// Use 'tmp_ar' ...
MyClass mc(std::move(tmp_ar));