获取shared_ptr指向指针的指针的地址的几种方式
时间: 2023-10-17 22:12:42 浏览: 225
1. 使用std::addressof函数
可以使用std::addressof函数获取指向shared_ptr指针的指针的地址。例如:
```
std::shared_ptr<int> sp = std::make_shared<int>(42);
int** pptr = std::addressof(sp);
```
2. 使用get函数
也可以使用shared_ptr的get函数获取指针的地址,然后再取地址。例如:
```
std::shared_ptr<int> sp = std::make_shared<int>(42);
int** pptr = &sp.get();
```
需要注意的是,这种方式中需要保证get函数返回的指针是非空的。
3. 使用raw指针
也可以先获取shared_ptr内部指向的raw指针,然后再取地址。例如:
```
std::shared_ptr<int> sp = std::make_shared<int>(42);
int** pptr = &sp.get();
```
需要注意的是,这种方式中需要保证raw指针是非空的。同时,如果使用raw指针进行操作,需要注意避免出现内存泄漏等问题。
相关问题
获取shared_ptr指向指针的指针的地址
获取 `shared_ptr` 指向指针的指针的地址,可以使用 `&(*ptr)`。具体来说,`*ptr` 将 `shared_ptr` 解引用为原始指针,然后 `&` 操作符获取该指针的地址。示例如下:
```c++
#include <iostream>
#include <memory>
int main() {
auto ptr = std::make_shared<int>(42);
int** ptr_ptr = &(*ptr);
std::cout << "Value: " << **ptr_ptr << std::endl;
std::cout << "Address of ptr_ptr: " << &ptr_ptr << std::endl;
return 0;
}
```
输出结果为:
```
Value: 42
Address of ptr_ptr: 0x7ffeedf2d430
```
需要注意的是,这种做法并不安全,因为 `shared_ptr` 可能会在任意时刻释放其持有的指针,从而使得 `ptr_ptr` 指向一个已经被释放的内存地址。因此,在使用 `shared_ptr` 时,应该避免直接获取其指向指针的指针。
shared_ptr先转weak_ptr再转shared_ptr,这两个shared_ptr是否是同一个
不是同一个,转换成weak_ptr后再转换成shared_ptr,会创建一个新的shared_ptr对象。这是因为weak_ptr是一种智能指针,它不会增加所指向对象的引用计数,因此需要再转换成shared_ptr时重新创建一个新的对象,并将引用计数加1。此时,两个shared_ptr对象所指向的内存地址相同,但它们是不同的对象。
阅读全文