shared_ptr 未更改对象(Visual studio 2012)

shared_ptr not changing object (Visual studio 2012)

我有一个非常奇怪的问题。我无法用 shared_ptr.

修改我指向的对象

示例代码:

#include<memory>
#include<iostream>
using namespace std;

class foo
{
public:
    int asd;
    foo(){}
    ~foo(){}
};


 void d(shared_ptr<foo> c)
{
    c->asd = 3;
}

void main()
{
    foo a;
    a.asd = 5;
    d(make_shared<foo>(a));
    cout<<a.asd; //asd is still 5
}

据我所知,您可以使用“->”运算符访问 shared_ptr 指向的对象,那么我在这里做错了什么?如何通过共享指针更改 class 中的 asd 变量?

// create a temporary object by copying a
// the shared pointer you pass to d function actually points to this temporary object
d(make_shared<foo>(a));

// allocate and store foo object in shared_ptr instead
auto p_a(make_shared<foo>());
p_a->asd = 3;
d(p_a);

... so what am I doing wrong here?

来自 cppreference on std::make_shared [强调 我的]:

template< class T, class... Args >
shared_ptr<T> make_shared( Args&&... args );

Constructs an object of type T and wraps it in a std::shared_ptr using args as the parameter list for the constructor of T.

在你的例子中,你提供了一个 foo 的实例作为 std::make_shared 的参数,它将在 构造一个 类型的新对象时使用=16=];即,使用 foo (foo(const foo&)) 的默认提供的副本 CTOR。这个新对象将是一个临时对象,仅在调用 d(...).

时有效