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 ...
随机推荐
- 函数返回值 return
return 返回值 (后面跟的是数据类型) // 数字.字符串.布尔.函数.对象(元素.[].{}.null).未定义return:返回值 1)函数名+括号:fn1() ==> return ...
- spring mvc 参数传递的三种方式
springmvc.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=" ...
- Spring3.2AOP实现需要添加的三个包
Spring3.2AOP实现需要添加的三个包 http://down.51cto.com/data/1001395 http://down.51cto.com/data/519542
- Java的IO操作中有面向字节(Byte)和面向字符(Character)两种方式
解析:Java的IO操作中有面向字节(Byte)和面向字符(Character)两种方式.面向字节的操作为以8位为单位对二进制的数据进行操作,对数据不进行转换,这些类都是InputStream和Out ...
- 统计SQLSERVER表行数,以及每天数据变化的行数
此sql对监控系统很有帮助,知道哪些表压力大,每天的数量级大概多少等信息. 得到这些信息就可以做相应的策略来进行系统优化. create table tmp( name varchar(50), ro ...
- nodejs 中使用 mocha + should + jscoverage 生成 单元测试覆盖率报告
最近一直在做nodejs,而关于js的单元测试覆盖率网上资料比较少而且吧比较零散,我从网上找来一些资料整理一下分析给大家,希望大家可以少走弯路. 首先我是从windows环境下测试的,用到的工具有 m ...
- Swift 2.2 协议和代理
一:代理 两个类之间的传值,类A调用类B的方法,类B在执行过程中遇到问题通知类A,这时候我们需要用到代理(Delegate). 比如:控制器(Controller)与控制器(Controller)之间 ...
- [python]什么是生成器
看理论硬是看的抓狂,然后去百度贴吧看到了一句话,什么叫python生成器,简直秒懂
- 在Express的页面模板中的变量的定义与使用总结
前言 最近在使用Express框架中的ejs页面模板趟了些许坑,仅以本文记录总结. 本文简述的均为ejs页面模板. 创建ejs变量的各种方法 1. 在Nodejs定义的ejs变量 ejs由是在node ...
- Javascript面对对象. 第五篇
继承 继承是面向对象中一个核心的概念.其他正统面向对象语言都会用两种方式实现继承: 一个是接口实现,一个是继承. 而ECMAScript只支持继承,不支持接口实现,而实现继承的方式依靠原型链完成. / ...