5

我对智能指针有点困惑。在下面的代码中,& 运算符应该返回智能指针分配的地址还是它所控制的指针的地址?

main() {
    std::shared_ptr<int> i = std::shared_ptr<int>(new int(1));
    std::shared_ptr<int> j = i;
    printf("(%p, %p)\n", &i, &j);
}

运行代码,我得到了不同的地址。如果我使用原始指针运行等效代码,我会得到相同的地址:

main() {
    int e = 1;
    int *k = &e;
    int *l = k;

    printf("(%p, %p)\n",k,l);
}
4

3 回答 3

6

在第一个示例中,您将获取智能指针对象的地址。智能指针中包含的原始指针是通过该get()函数提供的。

实际上,智能指针的地址获取几乎与常规指针完全相同。您的第一个示例的原始指针等效项是:

main() {
    int e = 1;
    int *k = &e;
    int *l = k;

    printf("(%p, %p)\n",&k,&l); // now they're different!
}

与您的第二个示例等效的智能指针将是这样的:

main() {
    std::shared_ptr<int> i = std::shared_ptr<int>(new int(1));
    std::shared_ptr<int> j = i;
    printf("(%p, %p)\n", i.get(), j.get()); // now they're the same!
}
于 2013-05-24T04:50:32.500 回答
0

Here, the main trick is that equality operator (=) for shared pointers are defined in such a way that when you do:

std::shared_ptr<int> j = i;

j will not be a complete copy of i. but it will just keep the same raw pointer the shared pointer i holds and therefore, their addresses will be different.

于 2013-05-24T05:47:53.380 回答
0

请调用 std::shared_ptr 的 .get() 成员函数获取你想要的地址。

于 2013-05-24T04:40:23.743 回答