智能指针

上周五排查了一个由于XXX模块操作疏忽导致栈越界引发的我的模块的智能指针Crash问题,因此稍微研究了一下,以作参考:
shared_ptr共享被管理对象,同一时刻可以有多个shared_ptr拥有对象的所有权,当最后一个shared_ptr对象销毁时,被管理对象自动销毁

shared_ptr 实现

简单来说,shared_ptr实现包含了两部分,
• 一个指向堆上创建的对象的裸指针,raw_ptr
• 一个指向内部隐藏的、共享的管理对象。share_count_object
第一部分没什么好说的,第二部分是需要关注的重点:
use_count,当前这个堆上对象被多少对象引用了,简单来说就是引用计数。
weak_count,这个管理对象被多少个智能指针共享了,简单来说就是管理对象的引用计数。
不同指针创建的对同一个堆上对象的智能管理,并不共享管理对象,因此存在double free的可能性。shared_ptr直接包含的裸指针,即raw prt,是为了实现一般指针的->,*等操作,通过shared_count object间接包含的指针是为了管理对象的生命周期,回收相关资源。
换句话说,shared_count object内部的use_count主要用来标记被管理对象的生命周期,weak_count主要用来标记管理对象的生命周期。

注意区分管理和被管理。

了解了原理,可以看出std::share_ptr本身的raw ptr指向了堆上通过new创建的对象。但是其自身这个raw ptr却会如果在不当操作上,被修改,比如栈越界操作,就会被破坏,导致产生对非法对象的访问:

int i = 5;
NSLog(@"i address is %p", &i);

XXX::XX df = XXX::XX::buildDataFrame();
NSLog(@"sp0 address is %p", &df);

int a[1] = {1};

NSLog(@"k address is %p", a);

for (int i = 0; i < 10; i++) {
    a[i] = i;
}

NSLog(@"haha");

上述这段代码就会引发问题,这里XXX::XX的具体内部设计使用了经典的RAII,下文再表。


   转载规则


《智能指针》 吴杭沉 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
拷贝构造函数与赋值函数 拷贝构造函数与赋值函数
在进行C++类编写的过程之中,通常会涉及到类的拷贝构造函数与类的赋值函数。初涉类编写的代码,对于两类函数的用法一直是挺让人困惑的内容。这篇文章我们会详细来梳理拷贝构造函数与赋值函数的区别。 调用了哪个函数?上述两种函数的使用和C++之中类的
2024-09-03
下一篇 
右值引用 右值引用
概述右值引用的概念有些读者可能会感到陌生,其实他和C++98/03中的左值引用有些类似,例如,c++98/03中的左值引用是这样的: int i = 0; int& j = i;这里的int&是对左值进行绑定,但是int&a
2024-09-02
  目录