普通指针转std::shared_ptr
时间: 2023-07-28 07:09:08 浏览: 104
普通指针可以通过将其传递给 `std::shared_ptr` 的构造函数来转换为 `std::shared_ptr`。下面是一个示例:
```cpp
int* ptr = new int(42); // 创建一个普通指针
std::shared_ptr<int> sharedPtr(ptr); // 使用普通指针初始化 std::shared_ptr
// 确保不再使用普通指针后,释放内存
// delete ptr;
```
在上面的示例中,我们创建了一个 `int` 类型的普通指针 `ptr`,然后将其传递给 `std::shared_ptr` 的构造函数来创建一个共享所有权的智能指针 `sharedPtr`。
当我们不再使用普通指针时,我们可以选择是否手动释放内存。如果要手动释放内存,只需取消注释 `// delete ptr;` 这一行即可。否则,当 `sharedPtr` 超出范围时,它将自动释放内存。
相关问题
std::shared_ptr
是什么,有什么用途?
std::shared_ptr是C++11标准中的一个智能指针,用于管理动态分配的内存资源。它通过引用计数的方式,跟踪被指向的内存资源的引用次数,从而实现自动内存管理。它的使用方式与普通指针类似,但具有更高的安全性和可维护性。当多个智能指针指向同一个对象时,shared_ptr会自动增加引用计数,直到所有的智能指针都超出作用域或被手动释放,此时引用计数会减少,当引用计数为0时,shared_ptr会自动释放所指向的内存资源。因此,std::shared_ptr在防止内存泄漏和避免重复释放内存等方面有很大的作用。
std::shared_ptr<std::ostream> coutPtr(&std::cout, [](std::ostream *) {}); 详细解析
`std::shared_ptr<std::ostream>` 是 C++ 中一种智能指针,它用于管理 `std::ostream` 的生命周期。在这个示例中,`coutPtr` 是指向标准输出流 `std::cout` 的共享指针,并传递了一个空的lambda表达式作为析构函数的参数。
1. **创建 shared_ptr**:
```cpp
std::shared_ptr<std::ostream> coutPtr(&std::cout);
```
这里直接初始化了一个指向 `std::cout` 的 shared_ptr,当不再有其他引用指向 `cout` 时,其析构函数会被自动调用以释放资源。
2. **传递析构函数**:
```cpp
std::shared_ptr<std::ostream> coutPtr(&std::cout, [](std::ostream *os) {});
```
第二个参数是一个 lambda 表达式,它接受一个 `std::ostream*` 参数 `os`。这相当于设置了一个自定义的析构行为,但在这里实际上并没有做任何事情,因为我们传递的是一个空函数(`[]()`),所以不会执行任何清理操作。
3. **利用 shared_ptr 的特性**:
- 因为 `coutPtr` 是共享所有权的,多个地方可以安全地持有同一个 `std::ostream` 的引用而无需担心内存泄漏。
- 当最后一个拥有者不再使用 `coutPtr` 时,由于传入的析构函数为空,`std::cout` 不会被关闭,通常我们会在 `std::shared_ptr` 初始化时传递 `std::default_delete<OutputStream>()` 来确保资源的正确清理。
4. **输出流操作**:
如果你想像普通 `std::ostream` 那样使用 `coutPtr`,可以直接调用它的成员函数来输出内容,就像这样:
```cpp
coutPtr << "Hello, World!";
```
注意,这里不需要显式调用 `get()` 函数来获取底层的指针,因为 `operator<<` 操作符会自动通过 `shared_ptr` 解引用。
阅读全文