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

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

本文关键字:shared ptr 对象 修改 可以通过 原始 指针 为什么      更新时间:2023-10-16

因此,我想使用一个函数来通过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

遗憾的是,foo.isActive返回false,而我希望它返回true。但问题是,它可以使用原始指针:

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。这是原始指针和智能指针之间的主要区别之一。你可以让智能指针像原始指针一样工作,但这是一项艰巨的工作,而且没有原始指针也可以,所以不值得尝试修改智能指针来获得这种行为。

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

您可以使用进行验证

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