当前位置: 首页 > 面试题库 >

请你来说一下智能指针shared_ptr的实现?

昝阳嘉
2023-03-14
本文向大家介绍请你来说一下智能指针shared_ptr的实现?相关面试题,主要包含被问及请你来说一下智能指针shared_ptr的实现?时的应答技巧和注意事项,需要的朋友参考一下

核心要理解引用计数,什么时候销毁底层指针,还有赋值,拷贝构造时候的引用计数的变化,析构的时候要判断底层指针的引用计数为0了才能真正释放底层指针的内存**

template **class SmartPtr{private:T *ptr; //底层真实的指针int *use_count;//保存当前对象被多少指针引用计数public:SmartPtr(T *p); //SmartPtrp(new int(2));SmartPtr(const SmartPtr&orig);//SmartPtrq(p);SmartPtr&operator=(const SmartPtr &rhs);//q=p~SmartPtr();T operator*(); //为了能把智能指针当成普通指针操作定义解引用操作T*operator->(); //定义取成员操作T* operator+(int i);//定义指针加一个常数int operator-(SmartPtr&t1,SmartPtr&t2);//定义两个指针相减`void getcount()** { return *use_count } }; template int SmartPtr::operator-(SmartPtr &t1, SmartPtr &t2) { return t1.ptr-t2.ptr; } template SmartPtr::SmartPtr(T *p) { ptr=p; try { use_count=new int(1); }catch (...) {**delete ptr; //申请失败释放真实指针和引用计数的内存**ptr= nullptr; delete use_count; use_count= nullptr; } } template **SmartPtr::SmartPtr(const SmartPtr &orig) //复制构造函数****{****use_count=orig.use_count;//引用计数保存在一块内存,所有的SmarPtr对象的引用计数都指向这里****this->ptr=orig.ptr;****++(\*use_count);//当前对象的引用计数加1**} template SmartPtr& SmartPtr::operator=(const SmartPtr &rhs) {**//重载=运算符,例如SmartPtrp,q; p=q;这个语句中,首先给q指向的对象的引用计数加1,因为p重新指向了q所指的对象,所以p需要先给原来的对象的引用计数减1,如果减一后为0,先释放掉p原来指向的内存,然后讲q指向的对象的引用计数加1后赋值给p**++*(rhs.use_count); if((--*(use_count))==0) { delete ptr; ptr= nullptr; delete use_count; use_count= nullptr; } ptr=rhs.ptr; *use_count=*(rhs.use_count); return *this; } template SmartPtr::~SmartPtr() { getcount();`if(--(*use_count)==0) //SmartPtr的对象会在其生命周期结束的时候调用其析构函数,在析构函数中检测当前对象的引用计数是不是只有正在结束生命周期的这个SmartPtr引用,如果是,就释放掉,如果不是,就还有其他的SmartPtr引用当前对象,就等待其他的SmartPtr对象在其生命周期结束的时候调用析构函数释放掉

 

 

{
getcount();
delete` `ptr;
ptr= nullptr;
delete` `use_count;
use_count=nullptr;
}
}
template` `<``typename` `T>
T SmartPtr::operator*()
{
return` `*ptr;
}
template` `<``typename` `T>
T*  SmartPtr::operator->()
{
return` `ptr;
}
template` `<``typename` `T>
T* SmartPtr::operator+(``int` `i)
{
T *temp=ptr+i;
return` `temp;
}
}

 

 类似资料:
  • 本文向大家介绍请你来说一下智能指针的内存泄漏如何解决?相关面试题,主要包含被问及请你来说一下智能指针的内存泄漏如何解决?时的应答技巧和注意事项,需要的朋友参考一下 为了解决循环引用导致的内存泄漏,引入了weak_ptr弱指针,weak_ptr的构造函数不会修改引用计数的值,从而不会对对象的内存进行管理,其类似一个普通指针,但不指向引用计数的共享内存,但是其可以检测到所管理的对象是否已经被释放,从而

  • 本文向大家介绍请你介绍一下C++中的智能指针?相关面试题,主要包含被问及请你介绍一下C++中的智能指针?时的应答技巧和注意事项,需要的朋友参考一下 智能指针主要用于管理在堆上分配的内存,它将普通的指针封装为一个栈对象。当栈对象的生存周期结束后,会在析构函数中释放掉申请的内存,从而防止内存泄漏。C++ 11中最常用的智能指针类型为shared_ptr,它采用引用计数的方法,记录当前内存资源被多少个智

  • 本文向大家介绍请你说一下你理解的c++中的smart pointer四个智能指针?相关面试题,主要包含被问及请你说一下你理解的c++中的smart pointer四个智能指针?时的应答技巧和注意事项,需要的朋友参考一下 C++里面的四个智能指针: auto_ptr, shared_ptr, weak_ptr, unique_ptr 其中后三个是c++11支持,并且第一个已经被11弃用。 为什么要使

  • shared_ptr被用来表示共享的拥有权。也就是说,当两段代码都需要访问一些数据,而它们又都没有独占该数据的所有权(从某种意义上来说就是该段代码负责销毁该对象)。这是我们就需要shared_ptr。shared_ptr是一种计数指针。当引用计数变为0时,shared_ptr所指向的对象就会被删除。下面我们用一段代码来说明这点。 void test() { shared_ptr p1(ne

  • 指针是C/C++区别于其他语言的最强大的语法特性,借助指针,C/C++可以直接操纵内存内容。但是,指针的引入也带来了一些使用上的困难,这要求程序员自己必须手动地对分配申请的内存区进行管理。 shared_ptr基本用法 智能指针的行为类似于常规指针,重要的区别是它负责自动释放所指向的对象。新标准提供的两种重要的智能指针的区别在于管理底层指针的方式:shared_ptr允许多个指针指向同一个对象;u

  • 本文向大家介绍请你说一下app性能测试的指标相关面试题,主要包含被问及请你说一下app性能测试的指标时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 1、内存:内存消耗测试节点的设计目标是为了让应用不占用过多的系统资源,且及时释放内存,保障整个系统的稳定性。当然关于内存测试,在这里我们需要引入几个概念:空闲状态、中等规格、满规格。 空闲状态指打开应用后,点击home键让应用后台运行,此时应用