为什么我可以通过原始指针而不是 shared_ptr 修改对象?

Why can I modify an object through a raw pointer but not a shared_ptr?

所以,我想使用一个通过 shared_ptr.

修改对象的函数

我有这个classFoo:

class Foo
{
private:
    bool i = false;

public:
    void activate()
    {
        i = true;
    }

    bool isActive()
    {
        return i;
    }
};

没什么特别的。我的目标是通过指针修改一个 Foo 对象,像这样:

Foo foo;

std::shared_ptr<Foo> ptrfoo = std::make_shared<Foo>(foo);
ptrfoo->activate();

// "foo.isActive" returns false here

可悲的是,foo.isActive returns false 当我想要 return true。但问题是,它适用于原始指针:

Foo foo;

Foo* ptrfoo = &foo;
ptrfoo->activate();

// "foo.isActive" returns true here

那么为什么会这样,我可以通过shared_ptr修改对象吗?如果可以,我该怎么做?

在第一个块中,shared_ptr 指向 foo 的副本。
在第二个块中,指针指向 foo.

您可以使用以下方式验证:

std::cout << "Address of foo: " << &foo << std::endl;
std::cout << "Pointer from shared_ptr: " << ptrfoo->get() << std::endl;

智能指针是拥有指针。因为当你这样做时,他们拥有他们指向的内存

std::shared_ptr<Foo> ptrfoo = std::make_shared<Foo>(foo);

您没有获得指向 foo 的指针,而是获得了指向作为 foo 副本的对象的指针。您对 ptrfoo 所做的任何操作都不会影响 foo。这是原始指针和智能指针之间的主要区别之一。您可以获得一个像原始指针一样工作的智能指针,但这需要大量工作,并且不拥有原始指针也可以,因此不值得尝试修改智能指针来获得该行为。