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

标签 c++ shared-ptr

所以,我想使用一个通过 shared_ptr 修改对象的函数。

我有这个类Foo:

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

遗憾的是,当我希望它返回 true 时,foo.isActive 返回 false。但问题是,它适用于原始指针:

Foo foo;

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

// "foo.isActive" returns true here

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

最佳答案

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

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

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

关于c++ - 为什么我可以通过原始指针而不是 shared_ptr 修改对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58530596/

相关文章:

c++ - 使用 std::weak_ptr 共享资源所有权

c++ - 如何初始化作为类成员的 shared_ptr?

c++ - VS2010的std::shared_ptr和boost::shared_ptr的区别

c++ - 这个变量将如何初始化?

c++ - 模板非类型模板化引用参数

c++ - 如何使用 win32 C 向对话框添加旋转控件?

c++ - OpenGl SuperBible实现相机俯仰(向上和向下看)

c++ - std::shared_ptr 中的错误?

c++ - std::shared_ptr 线程安全解释

c++ - 在这种情况下我会返回什么