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

Properly create shared pointer for other objects

本文关键字:共享 指针 创建 对象 其他 正确地      更新时间:2023-10-16

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

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

datastd::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)创建的向量需要一个副本进行初始化。然而,这两个实例仍然是不相关的。

代码:

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是对该对象的引用。后者看起来更接近您的预期。