指向容器的智能指针



通过引用发送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);

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

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

代码是正确的,因为m_ar(ar)tmp_ar的副本:mc没有引用局部变量tmp_ar因此mctmp_ar之间没有生命周期依赖关系。如果一个对象存储对另一个对象的引用,并在另一个对象被破坏时尝试使用该引用,则可能会出现问题(请参阅悬空指针,同样适用于引用)。

如果tmp_ar作为构造函数参数传递后不再需要tmp_ar,则可以std::move()d 以避免复制:

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));

相关内容

  • 没有找到相关文章

最新更新