我在修改类函数返回的智能指针的内容时遇到了一些问题。返回对指针的引用将是一种解决方案,但我担心这是一种不好的做法。
这是我的代码:
#include <memory>
#include <iostream>
class Foo
{
public:
Foo() : ptr_(new int(5)) {};
~Foo() {};
std::shared_ptr<int> bar()
{
return ptr_;
}
void print()
{
std::cout << *ptr_ << std::endl;
}
private:
std::shared_ptr<int> ptr_;
};
int main()
{
Foo f;
f.print();
// First case
f.bar() = std::make_shared<int>(23);
f.print();
// Second case
f.bar().reset(new int(23));
f.print();
// Third case
*f.bar() = 23;
f.print();
return 0;
}
这是输出:
5
5
5
23
为什么只有在第三种情况下ptr_会改变它的值?
答案 0 :(得分:2)
bar()会返回shared_ptr
的副本
因此,分配给该副本不会更改原始shared_ptr
。
为了使其按预期工作,您应该返回对内部指针的引用:
std::shared_ptr<int>& bar()
{
return ptr_;
}
答案 1 :(得分:1)
因为在前两种情况下,您只更改了返回的副本。在第三种情况下,您可以更改指针实际指向的内容。
如果您希望前两种情况起作用,请返回引用。
答案 2 :(得分:1)
这是因为bar()
应该返回对共享指针的引用,以便做你期望的事情:
std::shared_ptr<int>& bar()
答案 3 :(得分:1)
因为前两种情况在bar()返回的temp上使用赋值运算符,所以有效地将它从Foo中分离出来。在最后一种情况下,取消引用允许直接突变共享有效载荷。