通过引用发送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
因此mc
和tmp_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));