网站的控制面板,wordpress返回html原理,贾汪网站建设,游戏网站建设表格目录
答题格式#xff1a;
几个易错点
可能问法四#xff1a;
问题分析#xff1a;
问题解答#xff1a; 上回文说到#xff0c;weak_ptr的功能和区别#xff0c;并且进行了分析#xff0c;我们接着进行解答。
答题格式#xff1a;
int main() { std::we…目录
答题格式
几个易错点
可能问法四
问题分析
问题解答 上回文说到weak_ptr的功能和区别并且进行了分析我们接着进行解答。
答题格式
int main() { std::weak_ptrListNode wp; std::shared_ptrListNode sp; { std::shared_ptrListNode n1(new ListNode); wp n1;//虽然weak_ptr不支持直接管理资源但是可以管理shared_ptr已经管理的空间这边是直接拷贝了一个shared_ptr对象也可以使用make_shared //weak_ptr会遇到引用失效的问题, 主要是因为引用对象被置空了主要还是因为引用计数没有像shared_ptr那样及时更新的问题。然后其weak_ptr自己本身又没有析构函数无法及时释放 cout wp.expired() endl;//expired判断会不会引用失效如果失效了就是真的就会返回1没有就会返回0 n1-_data; sp wp.lock();//lock的作用是放止引用消失把wp的资源给跟他同生命周期的sp管理防止其过期因为shared_ptr一般不会出现引用失效的问题所以这个lock就相当于讲weak_ptr提升为类型为shared_ptr的sp这也说明了weak_ptr可以管理shared_ptr已经管理的资源相当于提升了。 } cout wp.expired() endl;//出了作用域n1销毁了此时wp就指向了一个空的空间 //就引用失效了原本会输出1的但是加上锁lock就不会了 return 0; } 所以结合上面代码答案如下
上面提到的expired 和lock面试官没问就不必说了 几个易错点
1。这些智能指针在用的时候还是要加上头文件memory这里你发现不加也没错主要是因为编译器隐式包含了。具体解释如下 虽然VS对于某些语法的优化很厉害但是这里绝对不会优化掉头文件的。所以还是带上比较好。
2。shared_ptr是不会出现引用失效的因为它的引用计数是会变的但是这里如果引用的是一个空的对象也就是说shared_ptr为nullptr那这里的引用计数就需要特殊处理的实际是给0的因为引用空的根本不需要管理。
3。weak_ptr是有引用计数的属于弱引用只是引用计数不会随着管理资源的改变而改变也就是不增加引用计数。
可能问法四
你知道什么是循环引用吗怎么解决这种情况
问题分析
这个问题就是在考察shared_ptr的缺点已经weak_ptr的研发原因属于背一背就可以了最多就是将一个例子。
问题解答 循环引用自然就是你引用着我我又引用着你呗你想释放资源我引用着你你得等我释放了才能释放但是我想释放又被你引用着这样绕来绕去就随都释放不了了。一下例子可做参考。
struct ListNode { int _data; shared_ptrListNode _next; shared_ptrListNode _prev; ~ListNode() { cout ~ListNode() endl; } };
int main() { // 循环引用 -- 内存泄露 shared_ptrListNode n1(new ListNode); shared_ptrListNode n2(new ListNode); cout n1.use_count() endl; cout n2.use_count() endl; n1-_next n2; n2-_prev n1; cout n1.use_count() endl; cout n2.use_count() endl; //在循环的地方使用weak_ptr就不会出现这种问题 //weak_ptr不支持管理资源不支持RAII return 0; } 可以看到引用计数正常增加了结果无法正常析构。
下面解释一下为什么 结论照成这种原因的本质就是引用计数的正常增加导致内部循环的部分无法释放所以解决问题的关键计数使得内部循环引用的部分的引用计数不会增加就可以了这时weak_ptr不会增加引用计数的优势就体现了只需要将链表内部循环的部分的管理的智能指针换成weak_ptr就可以了。
//weak_ptrListNode _next; //weak_ptrListNode _prev;