与类共享指针

时间:2016-01-20 13:55:47

标签: c++ smart-pointers

看到示例代码后,我感到很惊讶。因为当我说自己时,我最终得到了智能指针正在做的事情。但似乎还没有。我真的不明白输出如何显示2014。据我所知,就目前而言,这些课程是分开的。因此,除了继承,多态,嵌套分类等之外,它们之间不能存在关系。我可能会在研究智能指针时跳过一些重要的观点。有人可以照亮学生吗?

#include <iostream>
#include <memory>

class classA
{
    std::shared_ptr<int> ptA;
public:
    classA(std::shared_ptr<int> p) : ptA(p) {}
    void setValue(int n) {
        *ptA = n;
    }
};

class classB
{
    std::shared_ptr<int> ptB;
public:
    classB(std::shared_ptr<int> p) : ptB(p) {}
    int getValue() const {
        return *ptB;
    }
};

int main()
{
    std::shared_ptr<int> pTemp(new int(2013));
    classA a(pTemp);
    classB b(pTemp);

    a.setValue(2014);
    std::cout << "b.getValue() = " << b.getValue() << std::endl;


}

原始指针输出2013 代码:

#include <iostream>
#include <memory>

class classA
{
    int* ptA;
public:
    classA(int * p) {
        ptA = new int(*p);
    }
    void setValue(int n) {
        *ptA = n;
    }
    ~classA() {
        delete ptA;
    }
};

class classB
{
    int* ptB;
public:
    classB(int *p) : ptB(p) {}
    int getValue() const {
        return *ptB;
    }
};

int main()
{
    int* pTemp(new int(2013));
    classA a(pTemp);
    classB b(pTemp);

    a.setValue(2014);
    std::cout << "b.getValue() = " << b.getValue() << std::endl;


}

2 个答案:

答案 0 :(得分:4)

每个std::shared_ptr对象都有自己的指针(即它有一个指针成员变量),但所有这些指针都指向同一个地方。 / p>

让我们举一个使用普通“原始”指针的例子:

int* p = new int(2013);

现在你有一个指向某个内存的指针p。如果我们这样做

int* p2 = p;

然后我们有两个指针,但两者都指向完全相同的内存

这类似于shared_ptr的工作方式,每个shared_ptr对象都有一个内部指针(成员变量),每次复制shared_ptr时(就像传递给它时一样)函数)使用source-objects指针变量初始化内部成员变量(如上例中初始化时p2),导致两个对象的成员指针变量指向同一个内存。

答案 1 :(得分:0)

让我们删除智能指针的东西,因为它似乎只是让你感到困惑。

你的第一个代码是这样的,总结如下:

int v = 2013;

int* p1 = &v;
int* p2 = &v;

*p1++;  // Makes v = 2014, so *p2 = 2014.

你的第二个版本是这样的:

int v1 = 2013;
int v2 = 2013;

int* p1 = &v1;
int* p2 = &v2;

*p1++;  // Makes v1 = 2014, but v2 = 2013