首页 > 试题广场 >

简述一下智能指针

推荐

得分点

智能指针解决的问题、内存泄露、4种智能指针、实现原理

参考答案

标准回答

  1. 智能指针解决的问题

    如果在程序中使用 new 从堆(自由存储区)分配内存,等到不再需要时,应使用 delete 将其释放,如果忘记释放,则会产生内存泄露。C++ 引入了智能指针 auto_ptr(C++98), 以帮助自动完成这个过程。智能指针是行为类似于指针的类对象。

  2. 有哪些智能指针

    C++ 中有 4 种智能指针:auto_ptr、unique_ptr、shared_ptr、weak_ptr。其中 auto_ptr 在 C++11 中被弃用,weak_ptr 需要配合 shared_ptr 使用,并不能算是真正的智能指针。

  3. 智能指针实现原理

    智能指针解决问题的思想:将常规指针进行包装,当智能指针对象过期时,让它的析构函数对常规指针进行内存释放。

    auto_ptr(C++98的方案,C++11已经废弃):采用所有权模式,对于特定的对象,只能有一个智能指针可拥有它,这样只有拥有对象的智能指针的析构函数会删除该对象。然后,让赋值操作转让所有权。

    unique_ptr(替代 auto_ptr):也是采用所有权模式,实现独占式拥有或严格拥有概念,保证同一时间内只有一个智能指针可以指向该对象。

    shared_ptr:采用引用计数实现共享式拥有概念。多个智能指针可以指向相同对象,该对象和其相关资源会在最后一个引用被销毁时候释放。它使用引用计数来表明资源被几个指针共享。例如,赋值时,计数将加 1,而指针过期时,计数将减 1。仅当最后一个指针过期时,才调用 delete。

    weak_ptr:该类型指针通常不单独使用(没有实际用处),只能和 shared_ptr 类型指针搭配使用。weak_ptr 类型指针并不会影响所指堆内存空间的引用计数,可以用来解决循环引用问题。

加分回答

如何选择智能指针:

  • 如果程序要使用多个指向同一个对象的指针,应该选择 shared_ptr;

  • 如果程序不需要多个指向同一个对象的指针,则可以使用 unique_ptr;

  • 如果使用 new [] 分配内存,应该选择 unique_ptr;

  • 如果函数使用 new 分配内存,并返回指向该内存的指针,将其返回类型声明为 unique_ptr 是不错的选择。

编辑于 2021-09-15 11:29:13 回复(0)
智能指针的种类:一共有四种,分别是auto_ptr、unique_ptr、shared_ptr和weak_ptr。
在C++11中,auto_ptr被废弃掉,取而代之的是独占指针。
同时shaerd_ptr和weak_ptr是一起使用的,防止循环依赖的产生,使得shared_ptr得不到释放。

智能指针如何实现?
所谓智能指针,其实就是一个指针类,使用了智能指针之后,当指针的生命周期结束时,会自动调用析构函数释放内存资源,防止内存泄漏。

智能指针解决了什么问题?
当我们使用new在堆区创建了内存地址时,有时会忘记使用delete去释放内存,容易造成内存泄漏,而使用智能指针的话,它会自动调用析构函数去释放堆区的资源,从而防止内存泄漏。

实践中如何选择智能指针?
如果需要多个指向同一个对象的指针,则可以使用共享指针;反之则选择独占指针
发表于 2022-04-02 21:25:05 回复(0)
智能指针是一种用于管理动态分配内存的工具,它们是一种高级抽象,提供了在使用动态分配内存时更安全和方便的方式。智能指针通过封装指针,并提供一些额外的功能来确保资源的正确释放和管理,以避免内存泄漏和悬挂指针等问题。

在C++中,有几种智能指针的实现,包括:

1. **unique_ptr**:unique_ptr是独占所有权的智能指针,它确保只有一个指针可以指向给定的资源。当unique_ptr超出其作用域时,它会自动释放所管理的资源。它不允许复制或拷贝,但可以通过移动语义进行转移。

2. **shared_ptr**:shared_ptr允许多个智能指针共享同一个资源,它使用引用计数来跟踪资源的引用次数。只有当最后一个shared_ptr离开作用域时,资源才会被释放。shared_ptr可以拷贝和复制,因为引用计数会相应增加和减少。

3. **weak_ptr**:weak_ptr是一种弱引用智能指针,它可以观测shared_ptr所管理的资源,但并不增加引用计数。weak_ptr用于避免shared_ptr之间的循环引用问题,以避免内存泄漏。

这些智能指针类型是C++标准库提供的,它们帮助开发人员更好地管理内存,减少内存泄漏的风险,并提高代码的可靠性和安全性。通过正确使用智能指针,可以避免显式地进行内存管理(例如手动释放内存),减轻了程序员的负担,并提高了代码的可读性和可维护性。
发表于 2023-05-16 16:56:49 回复(0)