C++智能指针详细说明
时间: 2023-06-04 09:04:14 浏览: 169
智能指针是一种 C++ 中的数据类型,可以用来管理动态分配的内存。智能指针可以自动化的管理内存,使程序更加有效和安全。
智能指针与常规指针不同,因为它们使用了 RAII 技术(资源获取即初始化),这意味着在声明一个智能指针时就会分配内存,并在销毁时自动释放内存。智能指针还提供了一些额外的功能,如共享内存、所有权转移和自定义删除器,这使得它们比常规指针更强大和灵活。
C++11 中引入了三种主要的智能指针类型:unique_ptr、shared_ptr 和 weak_ptr。其中 unique_ptr 是独占式的智能指针,意味着只能有一个智能指针可以指向给定的内存对象。shared_ptr 是共享式的智能指针,可以有多个智能指针指向同一个内存对象。weak_ptr 是 shared_ptr 的一个弱引用,它不会增加内存对象的引用计数,也不会阻止内存对象被释放。
智能指针是 C++ 中的一种重要工具,可以帮助程序员有效地管理内存,并避免常见的内存泄漏和悬挂指针问题。
相关问题
c++智能指针相关知识面试回答,智能指针有几种,举例说明
C++中的智能指针是一种特殊类型的指针,它们自动管理内存,防止内存泄漏并提供对资源生命周期的控制。主要有三种常见的智能指针:
1. `std::unique_ptr`:这是独占所有权的智能指针,它保证一个对象只有一个所有者。当你传递一个`unique_ptr`到另一个函数时,所有权会转移给接收方。例如:
```cpp
std::unique_ptr<int> ptr(new int(5));
// 指针ptr现在拥有这个整数,当ptr离开作用域时,其内部的对象会被析构。
```
2. `std::shared_ptr`:这种智能指针允许多个共享所有权,当最后一个引用消失时,对象会被销毁。它是线程安全的,适合于数据需要被多个部分共享的情况。示例:
```cpp
std::shared_ptr<int> ptr1(new int(7)), ptr2 = ptr1;
// ptr1和ptr2都指向同一个int对象,当任何一个指针被删除时,内存会被释放。
```
3. `std::weak_ptr`:它是`shared_ptr`的弱引用版本,不会增加目标对象的引用计数,常用于跟踪强引用。如果强引用失效(没有其他shared_ptr引用),弱引用仍然有效直到对象被销毁。
智能指针的主要优点是自动处理内存分配和释放,减少了程序员手动管理内存的压力,并能避免内存泄露。面试时可能会问及如何选择合适的智能指针以及何时应该使用哪些类型的智能指针。
C++,指针,指针指向指针,智能指针,具体用法,并用代码举例说明
指针是C语言中的一个重要概念,它用于存储变量的内存地址。指针指向的是内存中的某个地址,可以通过指针来访问或修改该地址上的数据。
指针指向指针,也称为二级指针,它是一个指向指针变量的指针。通过二级指针,我们可以修改一级指针所指向的地址或值。
智能指针是一种C++语言中的特殊指针,它提供了自动管理内存分配和释放的功能。智能指针会在合适的时机自动释放所指向的内存,避免了手动管理内存的繁琐和出错的可能性。
下面是一个使用普通指针和二级指针的代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
int main() {
// 普通指针
int num = 5;
int* ptr = #
printf("普通指针: \n");
printf("num 的值: %d\n", num);
printf("ptr 的值: %p\n", ptr);
printf("ptr 所指向的值: %d\n\n", *ptr);
// 二级指针
int** ptr2 = &ptr;
printf("二级指针: \n");
printf("ptr2 的值: %p\n", ptr2);
printf("ptr2 所指向的一级指针的值: %p\n", *ptr2);
printf("ptr2 所指向的一级指针所指向的值: %d\n", **ptr2);
return 0;
}
```
输出结果为:
```
普通指针:
num 的值: 5
ptr 的值: 0x7ffee6f14504
ptr 所指向的值: 5
二级指针:
ptr2 的值: 0x7ffee6f14500
ptr2 所指向的一级指针的值: 0x7ffee6f14504
ptr2 所指向的一级指针所指向的值: 5
```
阅读全文
相关推荐
C++智能指针 ⼀ ⼀. 智能指针 智能指针 在 C++ 中,我们申请内存⼀般使⽤ new,释放内存时使⽤ delete,但是有时候我们可能由于疏忽会忘记 delete,或者当程序有多个 出⼝时,也会容易有 new 没有 delete,这样就产⽣了内存泄漏,如果你的程序是⼀个需要长期运⾏的服务器程序,可能运⾏着⼏天突然程 序就崩溃了,原因也不好定位,所以为了⽅便内存管理,C++ 引⼊了智能指针,智能指针的优点在于能够帮助程序员⾃动释放我们 new 出 来的堆内存。 C++ 标准库有四种智能指针:auto_ptr,unique_ptr,shared_ptr,weak_ptr(auto_ptr 是 C++98 标准的,其余都是 C++11 标准推出的,auto_ptr 现在已经不再使⽤了),C++11 这三种智能指针都是类模板。 ⼆ ⼆. shared_ptr (⼀)概述 (⼀)概述 shared_ptr 是⼀个共享式指针,所有的 shared_ptr 共享对指向内存的所有权,不是被⼀个 shared_ptr 拥有,⽽是多个 shared_ptr 之间互相协作。 (⼆)⼯作原理 (⼆)⼯作原理 引⽤计数,use_count 为 0 时就释放对象空间。 (三)初始化 (三)初始化 如果是定义了⼀个智能指针却不初始化,shared_ptr<int> p1,代表定义了⼀个指向 int 类型对象的智能指针但是⽬前指向为 empty。推荐使⽤ make_shared 函数来初始化 shared_ptr,它是标准库的函数模板,安全,⾼效地分配和使⽤ shared_ptr。 shared_ptr<int> pint = make_shared<int>(100); shared_ptr<string> pstr = make_shared<string>(5,'a'); 也可以使⽤直接初始化的⽅式 shared_ptr<int> pint(new int(100)) 来创建⼀个 shared_ptr 并初始化,但是由于 shared_ptr 定义 的构造函数是 explicit 的,因此不能使⽤ shared_ptr<int> pint = new int(100) 来创建⼀个 shared_ptr 并初始化,因为这种⽅式隐式要 求将⼀个普通的 int * 转换为 shared_ptr<int>。 (四)常⽤操作 (四)常⽤操作 1. use_count 返回多少个智能指针指向该对象,主要⽤于调试。 2. unique 判断该智能指针是否独占该内存,如果该智能指针不指向任何对象,判断 unique 的时候也是假。 3. reset 不带参数时:放弃指针对对象的掌管权,重置为 nullptr 带参数时:参数⼀般是⼀个 new 的空间,相当于放弃指针对当前对象的掌管权,然后将指针指向 new 出来的空间。 4. * 解引⽤,可以获取指针指向的对象。 5. get 获取指针指针⾥保存的裸指针,⼀般⽤于⼀些接⼝需要使⽤到 C 语⾔指针的情况。 6. swap 交换两个智能指针所指的对象。 7. =nullptr 该智能指针指向 nullptr,代表解除对该对象的掌握权,引⽤计数将会减1,如果此时该内存空间的引⽤计数变为0,会同时释放该内存。 8. 指定删除器以及删除数组问题 指定删除器以及删除数组问题 智能指针能在⼀定时机帮我们删除所指向的对象,使⽤ delete 作为默认的资源析构⽅式,我们也可以指定⾃⼰的删除器取代系统提供的默 认删除器,当智能指针需要删除所指向的对象时,编译器就会调⽤我们提供的删除器。 shared_ptr 指定删除器的⽅法⽐较简单,⼀般只需要在参数中添加具体的删除器函数即可。如果提供了删除器,那么就需要⼿动删除资 源,否则会造成内存泄漏。删除器函数可以是函数,lambda 表达式,重载了 operator() 的类等。 还可以使⽤ default_delete 来做删除器,default_delete 是标准库⾥的⼀个模板类。如:shared_ptr p3(new A[10], default_delete<A[]>()),这样就知道我们使⽤智能指针指向了⼀个对象数组,这样就可以正确释放了。 其实,使⽤ shared_ptr 指向对象数组不需要通过删除器的⽅式,只需要在定义 shared_ptr 时指为数组类型即可,如:shared_ptr<A[]> p4(new A[10])。 额外说明:就算是两个 shared_ptr 指定了不同的删除器,只要他们指向的对象类型相同,那么这两个 shared_ptr 也是同⼀个类型,可以 放到同⼀个容器去,vector<shared_ptr<int>> pvec{p1,p2}。 三 三