Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为其他对象正确创建共享指针_C++_Shared Ptr - Fatal编程技术网

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

C++ 为其他对象正确创建共享指针,c++,shared-ptr,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; //

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

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
}
intmain(){
//这就是我想分享的数据。为了简单起见
//使用整数向量
std::矢量数据;
//创建共享指针
//不允许正在访问的对象更改
//这就是为什么我输入const(可能是错误的)
//(实际做)
std::共享的指向向量的指针=
std::使_共享(数据);
//向要共享的对象添加数据
数据。推回(1);
数据。推回(2);
数据。推回(3);
数据。推回(4);
//如果我在这一点上看debu中指向向量的指针,它显示为no
//数据,大小为0
}
如果我在添加数据(推回)后创建共享指针(指针指向向量),它就会工作。但是,如果我想在程序中稍后向向量添加数据,指针将不会更新,因此对象无法访问新数据。
是否有我做错了什么,或者根本上我的理解是错误的?

数据
与使用
std::make_shared(数据)创建的实例无关

你真正想要的是

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::共享指针指向向量=
std::使_共享(数据);
//向要共享的对象添加数据
指向向量的指针->向后推(1);
指向向量的指针->向后推(2);
指向向量的指针->向后推(3);
指向向量的指针->向后推(4);

使用
std::make_shared(data)
创建的向量将复制一份用于初始化。但实例仍然不相关。

数据
与使用
std::make_shared(数据)创建的实例不相关

你真正想要的是

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::共享指针指向向量=
std::使_共享(数据);
//向要共享的对象添加数据
指向向量的指针->向后推(1);
指向向量的指针->向后推(2);
指向向量的指针->向后推(3);
指向向量的指针->向后推(4);
使用
std::make_shared(data)
创建的向量将复制一份用于初始化。不过,这些实例仍然不相关。

此代码:

std::vector<int> data;
auto pointer_to_vector = std::make_shared<std::vector<int>>(data);
然后您有一个新创建的向量,
数据
是对该对象的引用。后者看起来更接近您的预期。

此代码:

std::vector<int> data;
auto pointer_to_vector = std::make_shared<std::vector<int>>(data);

然后您有一个新创建的向量,
数据
是对该对象的引用。后者看起来更接近您的意图。

“共享”的意思是“共享对象”,而不是“共享对象”。和“给我做比萨饼”和“让我成为百万富翁”的区别一样。我该如何让一个物品共享?我必须使用带“*”的指针的传统方式,还是可以使用共享的ptr来完成?如果对象是动态分配的,您可以将指向它的指针传递给
共享的ptr
,让
共享的ptr
拥有它的所有权。如果它是一个自动或静态对象,您不能转移它的所有权。“make_shared”的意思是“make a shared object”,而不是“make a object shared”。和“给我做比萨饼”和“让我成为百万富翁”的区别一样。我该如何让一个物品共享?我必须使用带“*”的指针的传统方式,还是可以使用共享的ptr来完成?如果对象是动态分配的,您可以将指向它的指针传递给
共享的ptr
,让
共享的ptr
拥有它的所有权。如果它是自动或静态对象,则无法转移其所有权。很抱歉,代码中有一个输入错误,“所有输入”应为“数据”,已修复it@user6768079我相应地修正了我的答案,并对发生的情况做了更多的解释。当我使用指向向量的指针->时,我得到一个“无过载实例” error@user6768079您无法为堆栈上的对象创建共享指针。因此,如果我想与其他对象共享“数据”,我必须使用“std::vector*data\u pointer”类型指针。很抱歉,代码中有一个输入错误,“all\u int”应该是“data”,已修复it@user6768079我相应地确定了我的答案,再解释一下发生了什么。当我使用指向向量的指针->我得到一个“无过载实例”error@user6768079您无法为堆栈上的对象创建共享指针。因此,如果我想与其他对象共享“数据”,我必须使用“std::vector*data_pointer”类型指针?我在抄写示例时使用了
auto
,以确保可读性,而不改变任何代码的含义。我在抄写示例时使用了
auto
,以确保可读性,而不改变任何代码的含义。