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

Returning a smart pointer and assign it a value doesn't work

本文关键字:分配 不起作用 智能 指针 返回      更新时间:2023-10-16

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

这是我的代码:

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

bar()返回shared_ptr的副本。
所以赋值给那个副本并不会改变原来的shared_ptr

要使它像预期的那样工作,您应该返回对内部指针的引用:

std::shared_ptr<int>& bar()
{
   return ptr_;
}

因为在前两种情况下,您只更改返回的副本。在第三种情况下,更改指针实际指向的内容。

如果您希望前两种情况正常工作,则返回一个引用。

这是因为bar()应该返回一个对共享指针的引用,以便做你所期望的:

 std::shared_ptr<int>& bar()

因为前两种情况是对bar()返回的temp使用赋值操作符,有效地将其从Foo中分离出来。在最后一种情况下,解引用允许对共享负载进行直接更改。