正确为其他对象创建共享指针

时间:2016-10-13 16:45:38

标签: c++ shared-ptr

我正在尝试使用一个共享指针,该指针将在整个程序中共享给不同的对象。我注意到,当我在将指针提供给需要它的对象之前创建指针时,没有数据。这可能与我如何实现指针有关。我已经添加了一个我想要做的事情以及正在发生的事情的样本

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),它就可以工作。但是,如果我想稍后在程序中向向量添加数据,则不会更新指针,因此对象无法访问新数据。 有什么我做错了,或者从根本上说我的理解是错的?

2 个答案:

答案 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是该对象的引用。后者看起来更接近你的意图。