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学习之旅基础知识篇:面向对象之封装、继承及多态
Java是一种面向对象设计的高级语言,支持继承.封装和多态三大基本特征,首先我们从面向对象两大概念:类和对象(也称为实例)谈起.来看看最基本的类定义语法: /*命名规则: *类名(首字母大写,多个单词 ...
- WebRTC音视频引擎研究(2)--VoiceEngine音频编解码器数据结构以及参数设置
1.VoiceEngine Codec数据结构 WebRTC中,用一个结构体struct CodecInst表示特定的音频编解码器对象: struct CodecInst { int pltype; ...
- 让EFCore更疯狂些的扩展类库(一):通过json文件配置sql语句
前言 EF通过linq和各种扩展方法,再加上实体模型,编写数据库的访问代码确实是优美.舒服,但是生成的sql不尽如意.性能低下,尤其是复杂些的逻辑关系,最终大家还是会回归自然,选择能够友好执行sql语 ...
- 开箱即用 - Grunt合并和压缩 js,css 文件
js,css 文件合并与压缩 Grunt 是前端自动化构建工具,类似webpack. 它究竟有多强悍,请看它的 介绍. 这里只演示如何用它的皮毛功能:文件合并与压缩. 首先说下js,css 合并与压缩 ...
- mac bash_profile
# This is the filename where your incoming mail arrives. MAIL=~/mbox MAILCHECK=30 HISTFILE=~/.histor ...
- ubuntu无法进入桌面的修复
今天的kubuntu更新后停在了启动logo上,无法进入系统界面了. 先在网上找了找,搜到了一个看起来很像的. 1)ubuntu在系统启动logo过后无法进入桌面的处理方法 一般情况下,无法显示桌面, ...
- 游戏音频技术备忘 (五)Wwise Unreal Engine 集成代码浅析 二
AkAmbientSound类的实现 Unreal Engine提供了一个基本对象的构造器ObjectInitializer,一般来说用户创建的类总是拥有很多变量,因此 AkAmbientSound ...
- SVN-TortoiseSVN安装和常用操作步骤
安装VisualSVN-Server-2.0.5 服务端: 运行VisualSVN-Server-2.0.5.msi程序,点击Next,下面的截图顺序即为安装步骤: 2 图2: 注意:Server P ...
- 解析.NET对象的跨应用程序域访问(下篇)
转眼就到了元宵节,匆匆忙忙的脚步是我们在为生活奋斗的写照,新的一年,我们应该努力让自己有不一样的生活和追求.生命不息,奋斗不止.在上篇博文中主要介绍了.NET的AppDomain的相关信息,在本篇博文 ...
- https post
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.N ...