C++智能指针地址

问题描述 投票:0回答:3

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

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);
}
c++ pointers smart-pointers
3个回答
14
投票

在第一个示例中,您将获取智能指针对象的地址。智能指针中包含的原始指针是通过

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!
}

1
投票

调用

get()
的成员函数
std::shared_ptr<int>
来获取你想要的地址。


0
投票

这里的主要技巧是共享指针的相等运算符(

=
)的定义方式如下:

std::shared_ptr<int> j = i;

j 不会是 i 的完整副本。但它只会保留与我持有的共享指针相同的原始指针,因此,它们的地址将会不同。

© www.soinside.com 2019 - 2024. All rights reserved.