为什么我可以通过原始指针而不是 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
。这是原始指针和智能指针之间的主要区别之一。您可以获得一个像原始指针一样工作的智能指针,但这需要大量工作,并且不拥有原始指针也可以,因此不值得尝试修改智能指针来获得该行为。
所以,我想使用一个通过 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
。这是原始指针和智能指针之间的主要区别之一。您可以获得一个像原始指针一样工作的智能指针,但这需要大量工作,并且不拥有原始指针也可以,因此不值得尝试修改智能指针来获得该行为。