我正在尝试使用一个共享指针,该指针将在整个程序中共享给不同的对象。我注意到,当我在将指针提供给需要它的对象之前创建指针时,没有数据。这可能与我如何实现指针有关。我已经添加了一个我想要做的事情以及正在发生的事情的样本
int main() {
// This would be the data I want to share. For simplicity
// using a vector of ints
std::vector<int> data;
// Create the shared pointer
// The objects that are getting access are not allowed to change the
// the data so thats why I put in const (could be wrong on what that is
// actually doing)
std::shared_ptr<const std::vector<int>> pointer_to_vector =
std::make_shared<std::vector<int>>(data);
// Add data to the object wanting to share
data.push_back(1);
data.push_back(2);
data.push_back(3);
data.push_back(4);
// If I look at pointer_to_vector in debu at this point it shows no
// data, size 0
}
如果我在添加数据(push_back)后创建共享指针(pointer_to_vector),它就可以工作。但是,如果我想稍后在程序中向向量添加数据,则不会更新指针,因此对象无法访问新数据。 有什么我做错了,或者从根本上说我的理解是错的?
答案 0 :(得分:2)
data
与使用std::make_shared<std::vector<int>>(data);
创建的实例无关。
你真正想要的是
std::shared_ptr<const std::vector<int>> pointer_to_vector =
std::make_shared<std::vector<int>>(data);
// Add data to the object wanting to share
pointer_to_vector->push_back(1);
pointer_to_vector->push_back(2);
pointer_to_vector->push_back(3);
pointer_to_vector->push_back(4);
使用std::make_shared<std::vector<int>>(data)
创建的向量需要一份副本进行初始化。但实例仍然无关。
答案 1 :(得分:0)
此代码:
std::vector<int> data;
auto pointer_to_vector = std::make_shared<std::vector<int>>(data);
创建一个 data
副本的新对象,并返回指向它的共享指针。然后,您将元素添加到data
,但不添加到新矢量。
但是,如果你写:
auto pointer_to_vector = std::make_shared<std::vector<int>>();
auto& data = *pointer_to_vector;
然后您有一个新创建的向量,data
是该对象的引用。后者看起来更接近你的意图。