返回智能指针并为其赋值不起作用

时间:2013-04-29 13:07:18

标签: c++

我在修改类函数返回的智能指针的内容时遇到了一些问题。返回对指针的引用将是一种解决方案,但我担心这是一种不好的做法。

这是我的代码:

#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_会改变它的值?

4 个答案:

答案 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中分离出来。在最后一种情况下,取消引用允许直接突变共享有效载荷。