Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

智能指针 #74

Open
alwaystest opened this issue May 9, 2018 · 0 comments
Open

智能指针 #74

alwaystest opened this issue May 9, 2018 · 0 comments

Comments

@alwaystest
Copy link
Owner

智能指针

标签(空格分隔): Android C++


内存管理方式

对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制。
https://www.cnblogs.com/daocaoren/archive/2011/06/29/2092957.html

有了malloc/free为什么还要new/delete

malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。
  对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。
  C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。
既然new/delete的功能完全覆盖了malloc/free,为什么C++不把malloc/free淘汰出局呢?这是因为C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。
  如果用free释放“new创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。如果用delete释放“malloc申请的动态内存”,结果也会导致程序出错,但是该程序的可读性很差。所以new/delete必须配对使用,malloc/free也一样。
  https://chenqx.github.io/2014/09/25/Cpp-Memory-Management/

智能指针实现利用的机制

对于编译器来说,智能指针实际上是一个栈对象,并非指针类型,在栈对象生命周期即将结束时,智能指针通过析构函数释放其管理的堆内存

Template in C++

提取代码中公共的部分,把对应的类型提取为参数,编译时生成对应代码。如果非要粗暴的以Java的视角去看的话,写法看起来像是泛型。


轻量级指针的实现类为sp,它同时也是强指针的实现类。

为什么要这么说啊?给我一种 sp implements LightRefBase的错觉。

我的理解是spwp都是操作LightRefBaseRefBase的子类,通过spwp的构造函数和析构函数触发两个Base中的计数器变化,然后根据计数器变化和ObjectLifeTime决定自动释放内存的。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant