node c++多线程插件 第二天 c++指针
虽然取名叫node多线程插件,但是目前还是在学习c++的情况。
今天谈一谈c++指针。
c++指针就像是c#中的引用变量,例如一个Person类的实例zs{Name="张三",Age=18,Gender='男'}。我们知道c#中的引用变量在栈内存中开辟了一块内存一个地址,这个地址是这个对象实例在堆内存上的地址,也就是说通过这个引用,系统会去堆内存寻找这块内存上的数据。
c++的指针就是这样的东西,指针本身保存在栈中,保存一个地址,这个地址指向一块堆内存。
目前我用到的c++非指针变量都是存在栈上的,即便是一个Person类的实例对象,比如上面的zs
Person zs= Person("张三",18,'男');
Person zs("张三",18,'男');
上面两种写法是一样的,创建一个Person类的实例,但是和c#不同的是,这些数据是保存在栈里面的,因为没有申请堆内存,所以我们自己只能使用栈内存。这有点像c#的结构(struct)。
如果要申请堆内存,就要使用new去申请
Person* zs = new Person("张三",18,'男');
通过new出来的东西就是去申请堆内存,返回的是该类型的指针。
关于class和struct的区别
c++中感觉没有什么区别,c#中结构是全保存在栈中的数据结构,而类是保存在堆中的数据结构,但在c++中都可以不适用new,从而保存数据在栈中,也都可以使用new,让数据保存在堆中得到这个实例的指针。
当然还是有一些细节差别,这个网上有很多文章,我不再赘述。
关于垃圾回收
c++中没有自动回收这么一说,所以请求的内存在使用完毕后应该立即回收。
这里提一个词:内存泄漏,就是指用完的内存没有进行回收,比如
while(true){Sleep(5000);//创建一个对象},
这句代码可能在c#中因为自动回收,隔一段时间创建的对象就会被回收没有什么问题。
在c#中这段代码"可能"不会报错,仅仅是可能,我没有试过。
但在c++中一定会异常,因为请求的内存没有释放。
这里首先要明确一点,需要释放的内存指的是堆内存。栈内存在其作用域末尾(即大括号结尾)就被释放了,但是堆中的内存,也就是new的内存必须被手动释放,使用delete关键字,删除指针所指向的对象,即释放该对象占用的内存
delete zs;
但要注意一点,被释放的内存仅仅是对象本身的内存,如果对象有指针成员,这个成员是不会被释放的。
zs->Child ---> Person* zhangsi//假设Person对象有一个属性Child,是一个Person类型的指针
这个指针指向的内存并不会因为zs的释放而被自动释放。
Person* zhangsan=new Person("张三",28,'男');
Person* zhangsi=new Person("张四",3,'男');
zhangsan->Child=zhangsi;
delete zhangsan;
cout<< zhangsi->Name <<endl; //打印张四,并没有异常
cout<< zhangsan->Name<<endl; //异常,该对象已经被删除
如果没有注意到这一点,还是会造成内存泄漏。所以如果要联级删除,就需要在析构函数里进行删除。但是可能存在别的地方需要用到这个指针,所以这里使用智能指针。说起来比较麻烦,到这里我自己也不是很懂了。
这对于我在做的这个插件是一个挑战。怎么说呢,首先我从来没有接触过这种自己释放内存的语言,所以还要花时间去摸索,其次假如子线程异常了怎么办。关于后者,我觉得应该没有问题,只要把错误控制在js的层面上就不会出什么错。但是c++的层面还需要去维护。
现在想到的问题如下:
1、v8函数执行问题,因为谷歌被墙了,国内也没有什么资料,v8的一些东西并不是很懂。
2、async/await被唤醒后的执行问题。这点可能要重写async/await关键字,主要是考虑到await后的执行区域最终被主线程接管了还是子线程在执行,这点要实验后才知道。
3、线程强制退出的资源回收问题。关于这一点,如果线程执行的js函数异常,只需要进行封装让他不会异常就行了,但是如果在c++层面上调用了terminate函数怎么释放资源。目前想法是直接不允许调用这个函数
4、线程间锁的问题。关于这点可以考虑使用c++11标准库的thread和mutex
今天内容如上,明天来研究v8的东西
node c++多线程插件 第二天 c++指针的更多相关文章
- node c++多线程插件构想
最近想写一个node的c++插件实现线程.提供的api使用回调并进行二次包装使其返回一个promise,并且要求需要在工作线程里执行的函数为async函数.如果是node7.0以下的版本,函数必须返回 ...
- node c++多线程插件 第一天 c++线程相关函数
因为不会c++,今天主要是学习了一下c++的东西,感觉非常麻烦. 目前知道了c++里创建线程createThread,返回一个内核对象(HANDLE),我的理解是,c++中系统层面上的操作(线程,文件 ...
- 5天玩转C#并行和多线程编程 —— 第二天 并行集合和PLinq
5天玩转C#并行和多线程编程系列文章目录 5天玩转C#并行和多线程编程 —— 第一天 认识Parallel 5天玩转C#并行和多线程编程 —— 第二天 并行集合和PLinq 5天玩转C#并行和多线程编 ...
- MFC关于多线程中传递窗口类指针时ASSERT_VALID出错的另类解决 转
MFC关于多线程中传递窗口类指针时ASSERT_VALID出错的另类解决 在多线程设计中,许多人为了省事,会将对话框类或其它类的指针传给工作线程,而在工作线程中调用该类的成员函数或成员变量等等. ...
- Node.js C++ 插件学习指南
Node.js插件(addons) Node.js 插件是用 C++ 编写的动态链接共享对象,可以使用 require() 函数加载到 Node.js 中,且像普通的 Node.js 模块一样被使用. ...
- 解决vcenter 6.0 vcsa安装插件第二个的时候报错的问题
解决vcenter 6.0 vcsa安装插件第二个的时候报错的问题 需要打一下windows 的Microsoft v C++ 2013的2个补丁就可以正常运行了. 然后在后续安装过程中,到达最后一步 ...
- Node.js 多线程完全指南
[原文] 很多人都想知道单线程的 Node.js 怎么能与多线程后端竞争.考虑到其所谓的单线程特性,许多大公司选择 Node 作为其后端似乎违反直觉.要想知道原因,必须理解其单线程的真正含义. Jav ...
- [LeetCode] Populating Next Right Pointers in Each Node II 每个节点的右向指针之二
Follow up for problem "Populating Next Right Pointers in Each Node". What if the given tre ...
- 如何安装node.js支持插件
在eclipse插件中,node.js插件中比较知名的是nodeclipse. 从HBuilder6.3起,工具-插件安装,可直接选择nodeclipse插件安装.安装完毕后重启HBuilder新建n ...
随机推荐
- Java数据库连接--JDBC调用存储过程,事务管理和高级应用
相关链接:Jdbc调用存储过程 一.JDBC常用的API深入详解及存储过程的调用 1.存储过程的介绍 我们常用的操作数据库语言SQL语句在执行的时候要先进行编译,然后执行,而存储过程是在大型数据库系统 ...
- 开源第三方登录组件OAuthLogin2.0 支持QQ,阿里巴巴,淘宝,京东,蘑菇街,有赞等平台
Nuget地址:https://www.nuget.org/packages/OAuthLogin2.0/ 项目结构说明: AuthorizationProviders文件夹下主要存放内置的授权平台. ...
- 支付宝 Android 版使用的开源组件
支付宝 Android 版使用的开源组件 前言: 花了点时间整理了 支付宝 Android 客户端使用的开源组件,给需要的同学.在你不知道用什么开源框架的时候可以作下参考,毕竟支付宝是阿里的重量级产品 ...
- js json和字符串的互转
json与字符串的互转: 下面格式两种只是针对引号有稍微的区别 var result = JSON.parse("{\"a\":\"擦擦\",\ ...
- SSM框架注解整合
一.web应用环境 1.ServletContext 对于一个web应用,其部署在web容器(比如:tomcat)中,web容器提供其一个全局的上下文环境,这个上下文就是ServletContext, ...
- 从jvm的角度来看单例模式
最近在看jvm,发现随着自己对jvm底层的了解,现在对java代码可以说是有了全新的认识.今天就从jvm的角度来看一看以前自以为很了解的单例模式. 了解单例模式的人都知道,单例模式有两种:" ...
- loadrunner解决浏览器死机问题
初次接触loadrunner时,遇到很多问题.浏览器崩溃以及录不到脚本就折磨了一周时间.最后终于解决 一.浏览器崩溃问题 1.退出安全卫士和防火墙 2.去掉IE第三方扩展.工具-Internet选项- ...
- C++编程练习(8)----“二叉树的建立以及二叉树的三种遍历方式“(前序遍历、中序遍历、后续遍历)
树 利用顺序存储和链式存储的特点,可以实现树的存储结构的表示,具体表示法有很多种. 1)双亲表示法:在每个结点中,附设一个指示器指示其双亲结点在数组中的位置. 2)孩子表示法:把每个结点的孩子排列起来 ...
- java基础知识点---size(),length(),length的区别
List<Integer> a=new ArrayList<Integer>(); a.add(1); System.out.println(a.size()); int b[ ...
- 关于ionic开发的一些总结(项目启动设置,app图标名称更改)
1.更改包名称 一般项目刚生成时,ionic会根据项目名称自动给你生成一个包名.要修改包名的话,在根目录的config配置文件中,<widget id="x.x.x"换成自己 ...